! function(Y, f, S) {
	"use strict";
	var m = "ht";
	if(!Y[m]) {
		! function() {
			Date.now && Date.prototype.getTime || (Date.now = function() {
				return(new Date).getTime()
			}), Y.performance && Y.performance.now || function() {
				var O = Date.now();
				Y.performance || (Y.performance = {}), Y.performance.now = function() {
					return Date.now() - O
				}
			}();
			for(var q = Date.now(), r = 16, o = ["ms", "moz", "webkit", "o"], d = 0; d < o.length && !Y.requestAnimationFrame; ++d) Y.requestAnimationFrame = Y[o[d] + "RequestAnimationFrame"], Y.cancelAnimationFrame = Y[o[d] + "CancelAnimationFrame"] || Y[o[d] + "CancelRequestAnimationFrame"];
			Y.requestAnimationFrame || (Y.requestAnimationFrame = function(H) {
				var B = Date.now(),
					f = r + q - B;
				return 0 > f && (f = 0), q = B, Y.setTimeout(function() {
					q = Date.now(), H(performance.now())
				}, f)
			}), Y.cancelAnimationFrame || (Y.cancelAnimationFrame = function(W) {
				return Y.clearTimeout(W)
			})
		}();
		var M, F, A, i, r = Y.document,
			_ = null,
			z = Y[m] = {},
			C = Y[m + "config"],
			h = z.Default = C && C.Default || {},
			Q = z.Style = C && C.Style || {},
			O = z.Attr = C && C.Attr || {},
			p = z.Color = C && C.Color || {},
			a = z.IsGetter = C && C.IsGetter || {},
			W = Math,
			g = W.round,
			X = W.floor,
			q = W.ceil,
			n = W.sqrt,
			N = W.max,
			R = W.min,
			d = W.abs,
			s = W.cos,
			G = W.acos,
			L = W.sin,
			j = W.pow,
			H = W.asin,
			V = W.PI,
			Z = 2 * V,
			o = V / 2,
			l = W.tan,
			c = W.atan2,
			T = W.random,
			J = function(Y, h, y) {
				return Math.max(h, Math.min(y, Y))
			},
			e = !0,
			w = !1,
			b = Y.parseInt || global.parseInt,
			x = "2018-10-01",
			v = Y.navigator ? Y.navigator.platform.indexOf("Win") > -1 : !1,
			B = function(B) {
				return B * B
			},
			E = Y.setTimeout,
			u = Y.clearTimeout,
			U = Y.location,
			D = Y.navigator ? Y.navigator.userAgent.toLowerCase() : "",
			t = function(S) {
				return S.test(D)
			},
			P = t(/msie/) || t(/trident/),
			y = t(/msie 10/),
			$ = t(/edge/),
			K = t(/firefox/),
			I = t(/mac/),
			k = h.isTouchable === S ? v ? !1 : r ? "ontouchend" in r : !1 : h.isTouchable,
			Lm = "default",
			yg = "single",
			li = "multiple",
			np = "front",
			Cp = "back",
			vr = "left",
			Td = "right",
			Pi = "top",
			ed = "bottom",
			Hf = "center",
			Bc = "eye",
			On = "middle",
			Ql = "east",
			xe = "west",
			un = "north",
			Lo = "none",
			hh = "px",
			Uk = "absolute",
			Zb = "border",
			wk = "triangle",
			Qe = "rect",
			_c = "circle",
			Kn = "cylinder",
			xn = "shape",
			_p = "items",
			xq = "normal",
			So = "remove",
			gj = "clear",
			kb = "width",
			Yo = "height",
			Wd = "ingroup",
			Ek = "check",
			$n = "uncheck",
			Pl = "radio",
			Nc = "radioOn",
			rj = "radioOff",
			re = "points",
			Nb = "values",
			Vh = "series",
			Tg = "body",
			Cq = "label",
			ks = "label2",
			ef = "note",
			hf = "note2",
			gr = "icons",
			ie = "labelFont",
			qo = "labelColor",
			rp = "labelSelectColor",
			cp = "note.expanded",
			sl = "note2.expanded",
			$b = "edge.expanded",
			tq = "edge.points",
			rb = "edge.type",
			pl = "rotation",
			km = "getRotation",
			fd = "setRotation",
			Ji = "hidden",
			be = "visible",
			$h = "tuv",
			xf = "no",
			Om = "draw",
			Lj = "select",
			bj = "currentSubGraph",
			hn = "selectBackground",
			Bl = "autoMakeVisible",
			eq = "autoHideScrollBar",
			oq = "scrollBarColor",
			fb = "scrollBarSize",
			Rh = "indent",
			sd = "rowHeight",
			Tr = "columnLineColor",
			tj = "rowLineColor",
			tm = "columnLineVisible",
			Ir = "rowLineVisible",
			$q = "visibleFunc",
			Rq = "expandIcon",
			gn = "collapseIcon",
			Ym = "checkMode",
			Vn = "sortFunc",
			uf = "editable",
			hi = "batchEditable",
			hc = "tristate",
			cd = "asc",
			zo = "desc",
			Mh = "position",
			mf = "elevation",
			sb = "children",
			zp = "translateX",
			Dj = "translateY",
			qi = "dataModel",
			Zi = "maxSize",
			jp = "shape3d",
			Md = "shape3d.resolution",
			Sd = "shape3d.visible",
			Vr = "shape3d.from.visible",
			nb = "shape3d.to.visible",
			nn = "shape3d.top.visible",
			tb = "shape3d.bottom.visible",
			Eh = "repeat.uv.length",
			Dk = "serializeValue",
			Il = "deserializeValue",
			kh = "centerUniform",
			$i = "rgba(255,255,255,0)",
			ik = "style",
			Fl = "attr",
			Yl = "field",
			yr = "string",
			Tq = "boolean",
			Cr = "color",
			Kd = "int",
			en = "number",
			Ci = "ew-resize",
			sm = "ns-resize",
			rn = "pointer",
			Bi = "auto",
			Np = "mousedown",
			dp = "mousemove",
			Cd = "mouseup",
			bn = "mouseout",
			mj = "touchstart",
			bq = "touchmove",
			Bb = "touchend",
			Ob = "keydown",
			rr = "keyup",
			Id = K ? "DOMMouseScroll" : "mousewheel",
			Ve = k ? [mj, bq, Bb, Ob, rr, "keypress", "input", "contextmenu"] : [Ob, rr, "keypress", "input", Np, dp, Cd, bn, Id, "contextmenu", "mouseenter", "mouseleave", "mouseover"],
			Ch = _,
			pe = _,
			ci = _,
			fc = Cd.length,
			Sc = function() {
				ci && (u(ci.timeout), ci = _)
			},
			Hj = function() {
				ci && Fh(ci.e, ci.info)
			};
		Y.addEventListener && (k || (Y.addEventListener(bn, function() {
			Sc()
		}, !1), Y.addEventListener(Id, function() {
			Jh()
		}, !1)), Y.addEventListener(rr, function(h) {
			91 === h.keyCode ? oi = {} : delete oi[h.keyCode]
		}, !0), Y.addEventListener(Ob, function(a) {
			oi[a.keyCode] = !0
		}, !0));
		var $o, Mm, co, he = !1,
			Sh = _,
			ao = function(l, C) {
				var N = E(function() {
					delete Sh[N], Bh(Sh) && (Sh = _), l()
				}, C);
				return N
			},
			Hn = _,
			dk = {},
			us = {},
			En = {},
			pk = {},
			bb = {},
			oi = {},
			dm = {},
			tr = {},
			De = {},
			gq = {},
			Fg = /.json$/,
			dn = /^data:image\/svg\+xml/,
			Cs = {},
			Cf = [],
			ng = {},
			nr = _,
			Oe = _,
			_k = function() {},
			jd = function() {
				throw "Oops!"
			},
			yp = [0, 0, 0],
			Bf = [0, 0, 0, 0],
			ih = {
				x: 0,
				y: 0,
				width: 0,
				height: 0
			},
			ne = _,
			eg = _,
			Nr = _,
			xi = function(G) {
				eg && !G._72O && (Nr || (Nr = {}), Nr[G._72O = zm()] = G), $o != _ ? Ei() < .05 && i && !Mm && (bi = Sc) : bi = Yh
			},
			hr = function(c, i, n, J) {
				eg || (eg = {});
				var I = eg[c];
				if(I) {
					if(I.url === i) return;
					I.image ? (I.image.onload = _k, I.image.onerror = _k) : I.request && (I.request.onload = _k, I.request.onerror = _k)
				}
				if(Fg.test(i)) {
					var a = new XMLHttpRequest;
					if(eg[c] = {
							request: a,
							url: i
						}, a.overrideMimeType && a.overrideMimeType("text/plain"), i = h.beforeLoadURL(i), i.data) {
						var j = h.parse(i.data);
						jf(c, j), h.handleImageLoaded(c, j)
					} else a.open("GET", encodeURI(i), !0), a.onload = function(S) {
						if(200 === this.status || 0 === this.status) {
							var J = h.parse(S.target.response || S.target.responseText);
							jf(c, J), h.handleImageLoaded(c, J)
						} else jf(c, h.handleUnfoundImage(c, i) || _)
					}, a.onerror = function() {
						jf(c, h.handleUnfoundImage(c, i) || _)
					}, a.send(null)
				} else {
					var j = new Image;
					eg[c] = {
						image: j,
						url: i
					}, P && (i.toLowerCase().indexOf(".svg") > 0 || dn.test(i)) ? (r.body.appendChild(j), j.style.visibility = "hidden", j.onload = function() {
						E(function() {
							if(n && (j.width = n), J && (j.height = J), !j.width || !j.height) {
								var x = j.width || j.clientWidth,
									R = j.height || j.clientHeight;
								j.width = x, j.height = R
							}
							h.handleImageLoaded(c, j), jf(c, j), r.body.removeChild(j), j.style.visibility = ""
						}, 180)
					}, j.onerror = function() {
						jf(c, h.handleUnfoundImage(c, i) || _), r.body.removeChild(j), j.style.visibility = ""
					}) : (j.onload = function() {
						n && (j.width = n), J && (j.height = J), h.handleImageLoaded(c, j), jf(c, j)
					}, j.onerror = function() {
						jf(c, h.handleUnfoundImage(c, i) || _)
					}), /^data:image/.test(i) || (i = h.beforeLoadURL(i), /^data:image/.test(i) || (i = h.appendTimeStamp(i), i = encodeURI(i))), j.src = i
				}
			},
			jf = function(D, d) {
				if(us[D] = d, delete eg[D], Bh(eg) && (eg = _, Nr)) {
					for(var W in Nr) {
						var x = Nr[W];
						x._2O && (x._2O = {}), x.invalidateAll && x.invalidateAll(S, "imageLoaded", D), x.redraw && x.redraw(), x.iv(), delete x._72O
					}
					Nr = _
				}
				if(d && Nr)
					for(var W in Nr) {
						var x = Nr[W];
						x.invalidateAll && x.invalidateAll(S, "imageLoading", D), x.redraw && x.redraw(), x.iv()
					}
			},
			Bk = function() {
				return Y.performance && Y.performance.now ? Y.performance.now() : Date.now()
			},
			Oi = function(h, d) {
				d ? u(h) : Y.cancelAnimationFrame(h)
			},
			mo = function(o, V, Y) {
				return {
					width: o,
					height: V,
					comps: An(Y) ? Y : [Y]
				}
			},
			Pg = function(k, f) {
				return {
					type: _c,
					rect: [k, f, 1.6, 1.6],
					borderWidth: 1,
					borderColor: Hc,
					gradient: Xn,
					gradientColor: ji,
					background: Hc
				}
			},
			Lg = function(F, J) {
				return mo(16, 16, {
					type: wk,
					rect: [4, 4, 10, 8],
					background: F,
					rotation: J ? 1.57 : 3.14
				})
			},
			yk = function(h, r) {
				return mo(16, 16, {
					type: wk,
					rect: [4, 4, 8, 7],
					background: h,
					rotation: r ? 3.14 : 0
				})
			},
			cn = function(S) {
				var u = S._orientation;
				return "horizontal" === u || "h" === u
			},
			db = function(z) {
				var R = _ || 4,
					J = _ || 1,
					O = _ || 1;
				0 > R ? R = 0 : R > .25 && (R = .25);
				var q, p, v, i, l, $, d, S = .5,
					j = [],
					c = [],
					Y = [],
					U = Z / O,
					n = Z / J,
					e = S - R;
				for(p = 0; J >= p; p++)
					for(i = -V + p * n, $ = s(i), l = L(i), q = 0; O >= q; q++) v = q * U, d = e + R * $, j.push(s(v) * d, l * R, -L(v) * d), (F = z) && c.push(q / O, 1 - p / J);
				for(p = 0; J > p; p++) {
					var H = p * (O + 1),
						h = (p + 1) * (O + 1);
					for(q = 0; O > q; q++) Y.push(H + q, h + q + 1, h + q, H + q, H + q + 1, h + q + 1), Bp.z = is.z = z
				}
			},
			kr = function(e) {
				var U = 2,
					E = 0;
				for(var k in e) k.length === U && b(k, 32) === hp && (nr = Oe = e[k]), E++;
				return E
			},
			Ye = function(X, o, j, y) {
				return j || (j = k ? 5 : 3, j /= y || 1), {
					x: X - j,
					y: o - j,
					width: 2 * j,
					height: 2 * j
				}
			},
			$f = function(c, A, D, n) {
				var E = this;
				A || (A = k ? 5 : 3, D = 20, n = 20);
				var U = {
					x: c,
					y: A,
					width: D,
					height: n
				};
				if(D)
					for(var P = 0; D > P; P++)
						if(3 === D) n = 20;
						else
							for(var N = 0; n > N; N++) E = Y ? Y : D;
				var h = {
					x: V,
					y: 2 * V
				};
				if(Qf(U, h)) {
					var i = Yo[0] + Pi[0] + gj[1];
					Do[Bc] = E[i], E[i] = Ah[Bc]
				}
			},
			Ik = function(d) {
				return(/ble$/.test(d) || /ed$/.test(d) || a[d] ? "is" : "get") + d.charAt(0).toUpperCase() + d.slice(1)
			},
			Ah = function(g) {
				return "set" + g.charAt(0).toUpperCase() + g.slice(1)
			},
			Ol = function(H) {
				return typeof H === yr || H instanceof String
			},
			jb = function(I) {
				return typeof I === en
			},
			Yh = function(E) {
				return typeof E === Tq
			},
			Ki = function(N) {
				return N && "object" == typeof N
			},
			jc = function(y) {
				return "function" == typeof y
			},
			An = function(l) {
				return l instanceof Array
			},
			jg = function(t) {
				return t instanceof ag
			},
			Cn = function(k) {
				return An(k) ? new ag(k) : k
			},
			mm = function(P) {
				return P instanceof bf
			},
			Tk = function(Q) {
				return Q instanceof mq
			},
			Go = function(s) {
				return s instanceof Xf
			},
			Ef = function(m, O) {
				if(!(m instanceof z.Group)) return !1;
				if(!O) return m.isExpanded();
				var b = O.getDataUI(m);
				return b && b._88I ? !0 : !1
			},
			fh = function(G) {
				return G instanceof es
			},
			Pn = function(v) {
				return v && "IFRAME" === v.tagName
			},
			Ne = function(J) {
				return J == _ || h.numberDigits == _ ? J : parseFloat(J.toFixed(h.numberDigits))
			},
			Fo = function(A, V, f) {
				var w, Q = V.length;
				if(f)
					for(var u = 0; f > u; u++)
						if(3 === Q) A.push(V[0]), A.push(V[1]), A.push(V[2]);
						else
							for(w = 0; Q > w; w++) A.push(V[w]);
				else if(3 === Q) A.push(V[0]), A.push(V[1]), A.push(V[2]);
				else
					for(w = 0; Q > w; w++) A.push(V[w])
			},
			Vg = function(l) {
				return l ? Ki(l) ? l : {} : !1
			},
			yi = function(i, p, C) {
				var I, T = Ki(i) ? i : i.prototype;
				for(I in p) C && T[I] !== S || (T[I] = p[I]);
				return i
			},
			Fr = function(u) {
				return String.fromCharCode(u)
			},
			Un = function(V) {
				for(var w, u = 0, Z = ""; u < V.length; u++) w = V[V.length - 1 - u], "%" === w ? w = "'" : "a" === w ? w = '"' : "]" === w && (w = "\\"), Z += Fr(w.charCodeAt(0) - 1);
				return Z
			},
			wp = function(Z, _, K) {
				Z.superClass.constructor.apply(_, K)
			},
			Bh = function(g) {
				for(var I in g) return !1;
				return !0
			},
			Zk = function(Y) {
				return Y ? 0 === Y.length : !0
			},
			td = function(C, O) {
				return C === O ? !0 : C.x === O.x && C.y === O.y && C.width === O.width && C.height === O.height
			},
			bo = function(g, p, z) {
				return p > g ? p : g > z ? z : g
			},
			id = function(y) {
				return 0 > y ? -1 : y > 0 ? 1 : 0
			},
			Ei = function() {
				var x = 1e4 * L(fc++);
				return x - X(x)
			},
			jh = function(R, Y, L) {
				return Kf(R.x, R.y, Y.x, Y.y, L.x, L.y, L.x + L.width, L.y, !0) || Kf(R.x, R.y, Y.x, Y.y, L.x + L.width, L.y, L.x + L.width, L.y + L.height, !0) || Kf(R.x, R.y, Y.x, Y.y, L.x + L.width, L.y + L.height, L.x, L.y + L.height, !0) || Kf(R.x, R.y, Y.x, Y.y, L.x, L.y + L.height, L.x, L.y, !0)
			},
			Kf = function(r, M, H, J, h, P, m, O, S) {
				var g = (m - h) * (M - P) - (O - P) * (r - h),
					o = (O - P) * (H - r) - (m - h) * (J - M);
				if(0 !== o) {
					var D = g / o,
						A = r + D * (H - r),
						u = M + D * (J - M);
					return S && (A + Rc < R(r, H) || A - Rc > N(r, H) || A + Rc < R(h, m) || A - Rc > N(h, m) || u + Rc < R(M, J) || u - Rc > N(M, J) || u + Rc < R(P, O) || u - Rc > N(P, O)) ? _ : [A, u]
				}
				return _
			},
			kp = function(N, o, I) {
				if(N && I)
					if(o) {
						if(o === ik) return N.getStyle(I);
						if(o === Fl) return N.getAttr(I);
						if(o === Yl) return N[I]
					} else if(I = Ik(I), N[I]) return N[I]();
				return S
			},
			dh = function(W, P, G, I) {
				if(W && G)
					if(P) {
						if(P === ik) W.s(G, I);
						else if(P === Fl) W.a(G, I);
						else if(P === Yl) {
							var y = W[G];
							W[G] = I, W.fp("f:" + G, y, I)
						}
					} else G = Ah(G), W[G] && W[G](I)
			},
			ln = function(Y, p, D) {
				return p && "top" !== p ? "bottom" === p ? {
					x: Y.x,
					y: Y.y,
					width: Y.width,
					height: Y.height * D
				} : "right" === p ? {
					x: Y.x,
					y: Y.y,
					width: Y.width * D,
					height: Y.height
				} : "left" === p ? {
					x: Y.x + Y.width * (1 - D),
					y: Y.y,
					width: Y.width * D,
					height: Y.height
				} : void 0 : {
					x: Y.x,
					y: Y.y + Y.height * (1 - D),
					width: Y.width,
					height: Y.height * D
				}
			},
			Vc = function(O, A, W, C, Q) {
				A && jo(O, W, C, 1, Q, A)
			},
			Yn = function(d, V, w, P) {
				var S = 1 - d;
				return S * S * V + 2 * d * S * w + d * d * P
			},
			Bp = function(H, r, b, v, u) {
				var Z = 1 - H;
				return Z * Z * Z * r + 3 * Z * Z * H * b + 3 * Z * H * H * v + H * H * H * u
			},
			pg = function(w) {
				var n, W, f, u, I = 0;
				return w.forEach(function(B) {
					if(n = B.length, n > 0)
						for(W = B[0], u = 1; n > u; u++) f = B[u], I += uh(W, f), W = f
				}), I
			},
			nc = function(l, Y, U) {
				var R = "__" + l,
					b = function(o) {
						U.interactiveDisabled || U["handle_" + l](o)
					};
				U[R] || (U[R] = b, Y.addEventListener(l, b, !1))
			},
			Cl = function(f, B, Q) {
				var p = "__" + f,
					g = Q[p];
				g && (B.removeEventListener(f, g, !1), delete Q[p])
			},
			Rl = function(B, f) {
				var t = "_" + f;
				B[Ik(f)] = function() {
					return this[t]
				}, B[Ah(f)] = function(q) {
					var M = this[t];
					this[t] = q, this.fp(f, M, q)
				}
			},
			Jl = function(R) {
				return f.create(R)
			},
			Tb = function(Q) {
				if(!Q.element) {
					var z, K;
					(z = Q.textField) ? K = Bo(dc.TextField, z): (z = Q.textArea) ? K = Bo(dc.TextArea, z) : (z = Q.button) ? K = Bo(dc.Button, z) : (z = Q.comboBox) ? K = Bo(dc.ComboBox, z) : (z = Q.checkBox) ? K = Bo(dc.CheckBox, z) : (z = Q.radioButton) ? K = Bo(dc.RadioButton, z) : (z = Q.slider) ? K = Bo(dc.Slider, z) : (z = Q.colorPicker) ? K = Bo(dc.ColorPicker, z) : (z = Q.image) && (K = Bo(dc.Image, z)), K && (Q.element = K)
				}
			},
			Co = function(g, A) {
				var b = ff(g);
				return b._ht = A, b
			},
			ff = function(z, Q) {
				var D = r.createElement("div"),
					$ = D.style;
				return D.tabIndex = -1, D.onkeydown = Aj, $.msTouchAction = Lo, Ur(D, _, 0), k && $.setProperty("-webkit-tap-highlight-color", "rgba(0, 0, 0, 0)", _), z && ($.overflow = Ji), Q && Yb(Q, D), D
			},
			Qc = function(o, i) {
				var D = r.createElement("canvas"),
					N = D.style;
				return N.msTouchAction = Lo, i || (N.pointerEvents = Lo), Ur(D, _, 0), o && Yb(o, D), D
			},
			Ur = function(v, D, u) {
				var l = v.style;
				l.border = D ? D + " solid 1px" : 0, l.outline = 0, l.padding = u ? "0 " + u + hh : 0, uc(v)
			},
			uc = function(O) {
				var M = O.style;
				M.position = Uk, M.margin = 0, M.setProperty("box-sizing", "border-box", _), M.setProperty("-moz-box-sizing", "border-box", _)
			},
			Mj = function(d, U, G, V) {
				V || (V = dg), U != _ && (d.width = U * V, d.style.width = U + hh), G != _ && (d.height = G * V, d.style.height = G + hh)
			},
			Yb = function(u, j, B) {
				u.appendChild(j), B && (j.style.position = Uk)
			},
			tg = function(H, l) {
				l.split || (l += "");
				for(var J, R = l.split("\n"), j = 0, e = R.length, d = 0; e > d; d++) {
					var N = Re(H.font, R[d]);
					N.width > j && (j = N.width), J || (J = N.height)
				}
				return H.ss = R, {
					width: j,
					height: J * e
				}
			},
			ho = function(M, L, d, _, E, g) {
				var m = L.length;
				if(1 === m) qd(M, L[0], d, _, E);
				else
					for(var s = d.height / m, j = {
							x: d.x,
							y: d.y,
							width: d.width,
							height: s
						}, k = 0; k < L.length; k++) g ? ul(M, L[k], _, E, j.x, j.y, j.width, j.height, g) : qd(M, L[k], j, _, E), j.y += s
			},
			qd = function(O, R, h, P, f) {
				O.font = P ? P : sf, O.fillStyle = f ? f : jr, O.textAlign = Hf, O.textBaseline = On;
				var A, E;
				h ? h.width === S ? (A = h.x, E = h.y) : (A = h.x + h.width / 2, E = h.y + h.height / 2) : (A = 0, E = 0), O.fillText(R, g(A), g(E))
			},
			nq = function(Q) {
				Q.getView && (Q = Q.getView());
				var K = Q.offsetWidth || Q.scrollWidth;
				return !K && Q.style.width && (K = b(Q.style.width)), K
			},
			vl = function(v) {
				v.getView && (v = v.getView());
				var P = v.offsetHeight || v.scrollHeight;
				return !P && v.style.height && (P = b(v.style.height)), P
			},
			gd = function() {
				var V = function(t) {
						Aj(t), t.stopPropagation()
					},
					b = k ? [mj] : [Ob, Np, Id];
				return function(D) {
					var v = ff(),
						N = v.style;
					return N.backgroundColor = h.disabledBackground, D && (N.backgroundImage = "url(" + D + ")", N.backgroundPosition = "50% 50%", N.backgroundRepeat = "no-repeat no-repeat"), b.forEach(function(e) {
						v.addEventListener(e, V)
					}), v
				}
			}(),
			wc = function(s) {
				var e = s.getContext("2d");
				return e.save(), e.lineCap = sg, e.lineJoin = xj, e
			},
			bi = function(g, N, Z, f) {
				Zg(g, N * dg, Z * dg), f *= dg, 1 !== f && g.scale(f, f)
			},
			Zg = function(V, Z, i) {
				V.translate(Z, i)
			},
			lo = function(r, s) {
				s && r.rotate(s)
			},
			$l = function(Q, q, M) {
				q === S && (q = 1), M === S && (M = 1), (1 !== q || 1 !== M) && Q.scale(q, M)
			},
			Hm = function(s) {
				var V = r.activeElement;
				if(r.activeElement !== s) {
					V && V.forceOnblur && V.forceOnblur();
					for(var F = [], b = s.parentNode; b;) F.push([b, b.scrollLeft, b.scrollTop]), b = b.parentNode;
					if(k) s.focus();
					else {
						var A = Ae(),
							M = A.target;
						s.focus(), M.scrollLeft = A.left, M.scrollTop = A.top
					}
					F.forEach(function(n) {
						n[0].scrollLeft = n[1], n[0].scrollTop = n[2]
					})
				}
			},
			Pp = function(X) {
				return X && X.getView ? X.getView() : X
			},
			Pm = function(a, n, C, O, F) {
				if(2 === arguments.length && (C = n.y, O = n.width, F = n.height, n = n.x), a.isSelfViewEvent) a.setX(n), a.setY(C), a.setWidth(O), a.setHeight(F);
				else {
					var J = Pp(a),
						i = J.style;
					if((r.fullscreenElement || r.mozFullScreenElement || r.webkitFullscreenElement || r.msFullscreenElement) !== J) n !== S && (i.left = n + hh), C !== S && (i.top = C + hh), O !== S && (i.width = O + hh), F !== S && (i.height = F + hh);
					else {
						var e = h.getWindowInfo();
						i.left = (n = e.left) + hh, i.top = (C = e.top) + hh, i.width = (O = e.width) + hh, i.height = (F = e.height) + hh
					}
					a.endEditing && !k && a.endEditing(), a.redraw && a.redraw(), a.invalidate && a.invalidate(), a.onLayouted && a.onLayouted(n, C, O, F), a.fireViewEvent && a.fireViewEvent("layout")
				}
			},
			Im = function(T) {
				if(!T.touches) return T;
				var x = T.touches[0];
				return x ? x : T.changedTouches[0]
			},
			Qp = function(X) {
				return k ? Im(X).target : X.target
			},
			hk = function(H) {
				h.popup && h.popup.close(), h.popup = H
			},
			zg = _,
			Yc = function(x) {
				zg.handleWindowTouchMove(x)
			},
			vq = function(D) {
				zg.handleWindowTouchEnd(D), Y.removeEventListener(bq, Yc, !1), Y.removeEventListener(Bb, vq, !1), zg = _
			},
			Pq = function(R) {
				zg.handleWindowMouseMove(R)
			},
			Uf = function(d) {
				zg.handleWindowMouseUp(d), Y.removeEventListener(dp, Pq, !1), Y.removeEventListener(Cd, Uf, !1), zg = _
			},
			gc = function(k) {
				return 1 === _g(k)
			},
			kg = function(k, C) {
				return C ? C.keyCode === k : oi[k]
			},
			pq = function(V) {
				return Sj(V) && kg(65, V)
			},
			Hg = function(s) {
				return kg(46, s) || kg(8, s)
			},
			fr = function(T) {
				return function(H) {
					return H ? H.keyCode === T : oi[T]
				}
			},
			hp = 573,
			_m = [65, 83, 68, 87, 37, 38, 39, 40, 32, 13, 27],
			zr = fr(_m[0]),
			Cb = fr(_m[1]),
			Je = fr(_m[2]),
			Ij = fr(_m[3]),
			pi = fr(_m[4]),
			xm = fr(_m[5]),
			lb = fr(_m[6]),
			Qh = fr(_m[7]),
			ec = fr(_m[8]),
			iq = fr(_m[9]),
			_f = fr(_m[10]),
			ys = {
				65: 1,
				83: 1,
				68: 1,
				87: 1,
				37: 1,
				38: 1,
				39: 1,
				40: 1
			},
			bd = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 1187],
			Zm = _,
			cc = _,
			Xq = function(h, t) {
				Zm || (Zm = Qc()), Mj(Zm, h, t, 1);
				var L = wc(Zm);
				return L.clearRect(0, 0, h, t), L
			},
			Hl = function() {
				var W, A = {};
				return function(q) {
					var h, C = A[q];
					return C || (W || (W = Qc(), Mj(W, 1, 1, 1)), h = W.getContext("2d"), h.clearRect(0, 0, 1, 1), jo(h, 0, 0, 1, 1, q), C = h.getImageData(0, 0, 1, 1).data, C = A[q] = [C[0], C[1], C[2], C[3]]), C
				}
			}(),
			Qq = function(Q) {
				if(!Ol(Q)) return Q;
				var p = Hl(Q);
				return p.CA || (p.CA = [p[0] / 255, p[1] / 255, p[2] / 255, p[3] / 255]), p.CA
			},
			Lr = function(d, g, B, m, l) {
				var K = Qc();
				K.width = B, K.height = m;
				var y = K.getContext("2d");
				y.drawImage(d, 0, 0, B, m);
				try {
					for(var e = y.getImageData(0, 0, B, m), q = e.data, E = 0, p = q.length; p > E; E += 4) {
						var b = q[E + 0],
							j = q[E + 1],
							F = q[E + 2],
							W = q[E + 3];
						"override_a" === l ? q[E + 3] = 255 * g[3] : "override_rgb" === l ? (q[E + 0] = 255 * g[0], q[E + 1] = 255 * g[1], q[E + 2] = 255 * g[2]) : "override" === l ? (q[E + 0] = 255 * g[0], q[E + 1] = 255 * g[1], q[E + 2] = 255 * g[2], q[E + 3] = 255 * g[3]) : (q[E + 0] = g[0] * b, q[E + 1] = g[1] * j, q[E + 2] = g[2] * F, q[E + 3] = g[3] * W)
					}
					y.putImageData(e, 0, 0)
				} catch(J) {
					return d
				}
				return K
			},
			Do = function(P, o, g) {
				return o && (o = "miter" === g ? 8 * o + 20 : o + 1, P && jk(P, o)), o
			},
			vb = function(f, Z) {
				if(Z) {
					var H = new Fi(Z),
						J = f.width / 2,
						T = f.height / 2,
						O = kl([H.tf(-J, -T), H.tf(J, -T), H.tf(J, T), H.tf(-J, T)]);
					return O.x += f.x + J, O.y += f.y + T, O
				}
				return f
			},
			ig = function(U, M, t, c, N, w, n, $) {
				c *= Math.PI / 180;
				var V = {
						x: Math.cos(c) * (U.x - n.x) / 2 + Math.sin(c) * (U.y - n.y) / 2,
						y: -Math.sin(c) * (U.x - n.x) / 2 + Math.cos(c) * (U.y - n.y) / 2
					},
					S = Math.pow(V.x, 2) / Math.pow(M, 2) + Math.pow(V.y, 2) / Math.pow(t, 2);
				S > 1 && (M *= Math.sqrt(S), t *= Math.sqrt(S));
				var Z = (N == w ? -1 : 1) * Math.sqrt((Math.pow(M, 2) * Math.pow(t, 2) - Math.pow(M, 2) * Math.pow(V.y, 2) - Math.pow(t, 2) * Math.pow(V.x, 2)) / (Math.pow(M, 2) * Math.pow(V.y, 2) + Math.pow(t, 2) * Math.pow(V.x, 2)));
				isNaN(Z) && (Z = 0);
				var u = {
						x: Z * M * V.y / t,
						y: Z * -t * V.x / M
					},
					z = {
						x: (U.x + n.x) / 2 + Math.cos(c) * u.x - Math.sin(c) * u.y,
						y: (U.y + n.y) / 2 + Math.sin(c) * u.x + Math.cos(c) * u.y
					},
					h = function(m) {
						return Math.sqrt(Math.pow(m[0], 2) + Math.pow(m[1], 2))
					},
					L = function(R, U) {
						return(R[0] * U[0] + R[1] * U[1]) / (h(R) * h(U))
					},
					T = function(V, l) {
						return(V[0] * l[1] < V[1] * l[0] ? -1 : 1) * Math.acos(L(V, l))
					},
					E = T([1, 0], [(V.x - u.x) / M, (V.y - u.y) / t]),
					o = [(V.x - u.x) / M, (V.y - u.y) / t],
					F = [(-V.x - u.x) / M, (-V.y - u.y) / t],
					q = T(o, F);
				L(o, F) <= -1 && (q = Math.PI), L(o, F) >= 1 && (q = 0);
				var L = M > t ? M : t,
					r = M > t ? 1 : M / t,
					W = M > t ? t / M : 1;
				if(null == $) {
					var G = {
						x: 0,
						y: 0,
						width: 0,
						height: 0
					};
					jk(G, L), G.x *= r, G.width *= r, G.y *= W, G.height *= W;
					var v = new Fi(c);
					return G = kl([v.tf(G.x, G.y), v.tf(G.x + G.width, G.y), v.tf(G.x + G.width, G.y + G.height), v.tf(G.x, G.y + G.height)]), G.x += z.x, G.y += z.y, [{
						x: G.x,
						y: G.y
					}, {
						x: G.x + G.width,
						y: G.y
					}, {
						x: G.x + G.width,
						y: G.y + G.height
					}, {
						x: G.x,
						y: G.y + G.height
					}]
				}
				$.translate(z.x, z.y), $.rotate(c), $.scale(r, W), $.arc(0, 0, L, E, E + q, 1 - w), $.scale(1 / r, 1 / W), $.rotate(-c), $.translate(-z.x, -z.y)
			},
			se = function(b, E) {
				b && b.beginPath();
				for(var j, m, s, p = [], i = function(K) {
						for(var D, c = /(\-{0,1}[\d\.]+)/gi, s = []; D = c.exec(K);) s.push(parseFloat(D[0]));
						return s
					}, d = /([MmLlHhVvCcSsQqTtAa]{1}[\d\.,\s\-Zz]*)/gi, U = {
						x: 0,
						y: 0
					}; j = d.exec(E);) {
					var e = j[0],
						M = e.substr(0, 1);
					if("M" === M || "m" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 2) {
							var O = _[T],
								Q = _[T + 1];
							"m" === M && (O += U.x, Q += U.y), b && b.moveTo(O, Q), p.push({
								x: O,
								y: Q
							}), U.x = O, U.y = Q
						}
						m = s = null
					} else if("H" === M || "h" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 1) {
							var O = _[T];
							"h" === M && (O += U.x), b && b.lineTo(O, U.y), p.push({
								x: O,
								y: U.y
							}), U.x = O
						}
						m = s = null
					} else if("C" === M || "c" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 6) {
							var r = _[T],
								o = _[T + 1],
								A = _[T + 2],
								x = _[T + 3],
								O = _[T + 4],
								Q = _[T + 5];
							"c" === M && (r += U.x, o += U.y, A += U.x, x += U.y, O += U.x, Q += U.y), b && b.bezierCurveTo(r, o, A, x, O, Q), p.push({
								x: r,
								y: o
							}), p.push({
								x: A,
								y: x
							}), p.push({
								x: O,
								y: Q
							}), U.x = O, U.y = Q
						}
						m = [r, o, A, x, O, Q], s = null
					} else if("S" === M || "s" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 4) {
							var r, o;
							m ? (r = 2 * m[4] - m[2], o = 2 * m[5] - m[3]) : (r = U.x, o = U.y);
							var A = _[T],
								x = _[T + 1],
								O = _[T + 2],
								Q = _[T + 3];
							"s" === M && (A += U.x, x += U.y, O += U.x, Q += U.y), b && b.bezierCurveTo(r, o, A, x, O, Q), p.push({
								x: r,
								y: o
							}), p.push({
								x: A,
								y: x
							}), p.push({
								x: O,
								y: Q
							}), U.x = O, U.y = Q
						}
						m = [r, o, A, x, O, Q], s = null
					} else if("Q" === M || "q" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 4) {
							var r = _[T],
								o = _[T + 1],
								O = _[T + 2],
								Q = _[T + 3];
							"q" === M && (r += U.x, o += U.y, O += U.x, Q += U.y), b && b.quadraticCurveTo(r, o, O, Q), p.push({
								x: r,
								y: o
							}), p.push({
								x: O,
								y: Q
							}), U.x = O, U.y = Q
						}
						m = null, s = [r, o, O, Q]
					} else if("T" === M || "t" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 2) {
							var r, o;
							s ? (r = 2 * s[2] - s[0], o = 2 * s[3] - s[1]) : (r = U.x, o = U.y);
							var O = _[T],
								Q = _[T + 1];
							"t" === M && (O += U.x, Q += U.y), b && b.quadraticCurveTo(r, o, O, Q), p.push({
								x: r,
								y: o
							}), p.push({
								x: O,
								y: Q
							}), U.x = O, U.y = Q
						}
						m = null, s = [r, o, O, Q]
					} else if("V" === M || "v" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 1) {
							var Q = _[T];
							"v" === M && (Q += U.y), b && b.lineTo(U.x, Q), p.push({
								x: U.x,
								y: Q
							}), U.y = Q
						}
						m = s = null
					} else if("L" === M || "l" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 2) {
							var O = _[T],
								Q = _[T + 1];
							"l" === M && (O += U.x, Q += U.y), b && b.lineTo(O, Q), p.push({
								x: O,
								y: Q
							}), U.x = O, U.y = Q
						}
						m = s = null
					} else if("A" === M || "a" === M) {
						for(var _ = i(e), T = 0; T < _.length; T += 7) {
							var F = _[T],
								z = _[T + 1],
								K = _[T + 2],
								C = _[T + 3],
								D = _[T + 4],
								O = _[T + 5],
								Q = _[T + 6];
							"a" === M && (O += U.x, Q += U.y);
							var Y = ig(U, F, z, K, C, D, {
								x: O,
								y: Q
							}, b);
							Y && (p = p.concat(Y)), U.x = O, U.y = Q
						}
						m = s = null
					}
					var y = e.substr(e.length - 1);
					("z" === y || "Z" === y) && b && b.closePath()
				}
				return p
			},
			Rk = function(l, n) {
				var N, o, x = "L" === n[0],
					k = n.length;
				for(l.save(), x ? (l.transform(n[5], n[6], n[7], n[8], n[9], n[10]), N = l.createLinearGradient(n[1], n[2], n[3], n[4]), o = 11) : (l.transform(n[7], n[8], n[9], n[10], n[11], n[12]), N = l.createRadialGradient(n[1], n[2], n[3], n[4], n[5], n[6]), o = 13); k > o;) N.addColorStop(n[o], n[o + 1]), o += 2;
				l.fillStyle = N
			},
			is = function(H, Z) {
				var L, F, W, i, k, E, P, w, T, R, I, f, G, $ = "L" === H[0];
				L = $ ? 5 : 7, F = H[L], W = H[L + 1], i = H[L + 2], k = H[L + 3], E = H[L + 4], P = H[L + 5], w = Z[0], T = Z[1], R = Z[2], I = Z[3], f = Z[4], G = Z[5], H[L] = w * F + R * W, H[L + 1] = T * F + I * W, H[L + 2] = w * i + R * k, H[L + 3] = T * i + I * k, H[L + 4] = w * E + R * P + f, H[L + 5] = T * E + I * P + G
			},
			Vb = function(z, R, _, l) {
				var W = !1;
				if(z.beginPath ? z.beginPath() : W = !0, jg(R) && (R = R._as), jg(_) && (_ = _._as), _ && _.length) {
					for(var Z, X, K, Q, F = 0, P = 0, C = _.length; C > P; P++) Z = _[P], 1 === Z ? (X = R[F++], z.moveTo(X.x, W ? -X.y : X.y)) : 2 === Z ? (X = R[F++], z.lineTo(X.x, W ? -X.y : X.y)) : 3 === Z ? (X = R[F++], K = R[F++], z.quadraticCurveTo(X.x, W ? -X.y : X.y, K.x, W ? -K.y : K.y)) : 4 === Z ? (X = R[F++], K = R[F++], Q = R[F++], z.bezierCurveTo(X.x, W ? -X.y : X.y, K.x, W ? -K.y : K.y, Q.x, W ? -Q.y : Q.y)) : 5 === Z && z.closePath();
					l && 5 !== Z && z.closePath()
				} else {
					var k, O, B, g = R.length;
					if(g > 0) {
						for(k = R[0], z.moveTo(k.x, W ? -k.y : k.y), O = 1; g > O; O++) B = R[O], z.lineTo(B.x, W ? -B.y : B.y);
						l && z.closePath()
					}
				}
			},
			Lh = function(F, r, d, s) {
				if(jg(F) && (F = F._as), jg(r) && (r = r._as), r && r.length) {
					d = d || ar;
					for(var g, l, q, B, C, E, j, f, U = [], I = _, T = 0, z = 0, $ = r.length; $ > z; z++)
						if(g = r[z], 1 === g) U.push(I = []), I.push(F[T++]);
						else if(2 === g) I.push(F[T++]);
					else if(3 === g) {
						for(l = I[I.length - 1], q = F[T++], B = F[T++], E = 1; d > E; E++) j = Yn(E / d, l.x, q.x, B.x), f = Yn(E / d, l.y, q.y, B.y), I.push({
							x: j,
							y: f,
							b: !0
						});
						I.push(B)
					} else if(4 === g) {
						for(l = I[I.length - 1], q = F[T++], B = F[T++], C = F[T++], E = 1; d > E; E++) j = Bp(E / d, l.x, q.x, B.x, C.x), f = Bp(E / d, l.y, q.y, B.y, C.y), I.push({
							x: j,
							y: f,
							b: !0
						});
						I.push(C)
					} else 5 === g && I.push(I[0]);
					return s && 5 !== g && I && I.length > 2 && I.push(I[0]), U
				}
				return s && F.length > 2 && (F = F.slice(), F.push(F[0])), F ? [F] : []
			},
			Ud = function(u, r, U, H, L, S) {
				var J, Z, O, $ = Hl(r),
					V = H,
					C = $[0],
					t = $[1],
					N = $[2];
				if(U) {
					var o = Hl(U);
					J = o[0] - C, Z = o[1] - t, O = o[2] - N
				} else J = 255 - C, Z = 255 - t, O = 255 - N;
				for(S || (S = H > 10 ? 1 : .5, S = 1 > L ? R(S / L, 2) : S);
					(H -= S) > 0;) {
					var A = 1 - H / V,
						B = C + J * A,
						z = t + Z * A,
						M = N + O * A;
					B = R(q(B), 255), z = R(q(z), 255), M = R(q(M), 255), u.strokeStyle = "rgb(" + B + "," + z + "," + M + ")", u.lineWidth = H, u.stroke()
				}
			},
			ak = function() {
				var o = {};
				return function(u, Q) {
					var H = u + "-" + Q,
						W = o[H];
					if(W) return W;
					var v, x, N, C = Hl(u);
					return 0 > Q ? (Q = (100 + Q) / 100, v = q(C[0] * Q), x = q(C[1] * Q), N = q(C[2] * Q)) : (Q /= 100, v = C[0], x = C[1], N = C[2], v += (255 - v) * Q, x += (255 - x) * Q, N += (255 - N) * Q, v = R(q(v), 255), x = R(q(x), 255), N = R(q(N), 255)), o[H] = "rgb(" + v + "," + x + "," + N + ")"
				}
			}(),
			jo = function(x, K, L, H, E, X) {
				X && (x.fillStyle = X), x.beginPath(), x.rect(K, L, H, E), x.fill()
			},
			Zn = function(P, D, q, j, d, U, n) {
				P.beginPath(), nd[D](P, q.x, q.y, q.width, q.height, j, d, U, n)
			},
			$c = function(S, f, H, v, O) {
				var x = nd[H];
				S.fillStyle = x ? x(S, f, v ? v : ji, O.x, O.y, O.width, O.height) : f
			},
			ko = function(S, D, m, _, A, y) {
				try {
					if(!D.tagName && D.comps) {
						D._cacheImage_ || (D._cacheImage_ = {});
						var O;
						O = "override" === _ ? "colors_override" : "override_rgb" === _ ? "colors_override_rgb" : "override_a" === _ ? "colors_override_a" : "colors", D._cacheImage_[O] || (D._cacheImage_[O] = {
							__count__: 0
						});
						var i = D._cacheImage_[O][m];
						i || (D._cacheImage_[O].__count__ > h.imageCacheThreshold && (D._cacheImage_[O] = {
							__count__: 0
						}), i = z.Default.toCanvas(D, ui(D), Hk(D), null, A, y, m, null, _), D._cacheImage_[O][m] = i, D._cacheImage_[O].__count__++), D = i
					}
					S.fillStyle = S.createPattern(D, "repeat")
				} catch(b) {
					S.fillStyle = "black"
				}
			},
			aq = function(G, f, _, g, j, J, q) {
				G.save(), G.translate(f, _), G.scale(1, q / J), G.arc(0, 0, J, g, j), G.restore()
			},
			Gd = function(b, B, Q, R, x, c, N, i) {
				var u, n, G, w, y, J, X, Y, v, C, Z;
				if(d(x) > 2 * V && (x = 2 * V), y = q(d(x) / (V / 4)), u = x / y, n = -u, G = -R, y > 0) {
					J = B + s(R) * c, X = Q + L(-R) * N, i ? b.lineTo(J, X) : b.moveTo(J, X);
					for(var F = 0; y > F; F++) G += n, w = G - n / 2, Y = B + s(G) * c, v = Q + L(G) * N, C = B + s(w) * (c / s(n / 2)), Z = Q + L(w) * (N / s(n / 2)), b.quadraticCurveTo(C, Z, Y, v)
				}
			},
			Zd = function(f, P, u, q, T, k, c, I, L) {
				6 === arguments.length && (c = k, I = k, L = k);
				var C = P + q,
					s = u + T,
					z = T > q ? 2 * q : 2 * T;
				k = z > k ? k : z, c = z > c ? c : z, I = z > I ? I : z, L = z > L ? L : z;
				var R = .29 * L,
					B = .58 * L;
				f.moveTo(C, s - L), f.quadraticCurveTo(C, s - B, C - R, s - R), f.quadraticCurveTo(C - B, s, C - L, s), R = .29 * I, B = .58 * I, f.lineTo(P + I, s), f.quadraticCurveTo(P + B, s, P + R, s - R), f.quadraticCurveTo(P, s - B, P, s - I), R = .29 * k, B = .58 * k, f.lineTo(P, u + k), f.quadraticCurveTo(P, u + B, P + R, u + R), f.quadraticCurveTo(P + B, u, P + k, u), R = .29 * c, B = .58 * c, f.lineTo(C - c, u), f.quadraticCurveTo(C - B, u, C - R, u + R), f.quadraticCurveTo(C, u + B, C, u + c), f.lineTo(C, s - L)
			},
			so = function(d, w, P, U, N, c, n) {
				w && (P = g(P), U = g(U), n || (n = 1), d.fillStyle = w, d.beginPath(), d.rect(P, U, n, c), d.rect(P, U, N, n), d.rect(P, U + c - n, N, n), d.rect(P + N - n, U, n, c), d.fill())
			},
			Nd = function(y, o, E, F) {
				var N = F.x,
					c = F.y,
					C = F.width,
					h = F.height;
				if(!(!o || !E || 0 >= C || 0 >= h)) {
					var M, O = Ml(o),
						q = Ph(o),
						P = E > 0;
					1 === E || -1 === E ? (y.fillStyle = P ? O : q, y.beginPath(), y.rect(N, c, 1, h), y.rect(N, c, C, 1), y.fill(), y.fillStyle = P ? q : O, y.beginPath(), y.rect(N, c + h - 1, C, 1), y.rect(N + C - 1, c, 1, h), y.fill()) : (E = R(d(E), R(C / 2, h / 2)), M = y.createLinearGradient(N, c, N + E, c), M.addColorStop(0, P ? O : q), M.addColorStop(1, o), y.fillStyle = M, y.beginPath(), y.moveTo(N, c), y.lineTo(N + E, c + E), y.lineTo(N + E, c + h - E), y.lineTo(N, c + h), y.lineTo(N, c), y.fill(), M = y.createLinearGradient(N, c, N, c + E), M.addColorStop(0, P ? O : q), M.addColorStop(1, o), y.fillStyle = M, y.beginPath(), y.moveTo(N, c), y.lineTo(N + E, c + E), y.lineTo(N + C - E, c + E), y.lineTo(N + C, c), y.lineTo(N, c), y.fill(), M = y.createLinearGradient(N, c + h, N, c + h - E), M.addColorStop(0, P ? q : O), M.addColorStop(1, o), y.fillStyle = M, y.beginPath(), y.moveTo(N, c + h), y.lineTo(N + E, c + h - E), y.lineTo(N + C - E, c + h - E), y.lineTo(N + C, c + h), y.lineTo(N, c + h), y.fill(), M = y.createLinearGradient(N + C, c, N + C - E, c), M.addColorStop(0, P ? q : O), M.addColorStop(1, o), y.fillStyle = M, y.beginPath(), y.moveTo(N + C, c), y.lineTo(N + C - E, c + E), y.lineTo(N + C - E, c + h - E), y.lineTo(N + C, c + h), y.lineTo(N + C, c), y.fill())
				}
			},
			ek = function(P, q, m, J, V, F, K) {
				var s = P.createLinearGradient(J, V, F, K);
				return s.addColorStop(0, m), s.addColorStop(1, q), s
			},
			Xp = function(U, f, h, r, $, n, g) {
				var T = U.createLinearGradient(r, $, n, g);
				return T.addColorStop(0, f), T.addColorStop(.5, h), T.addColorStop(1, f), T
			},
			Oc = function(j, M, V, w, F, E, R) {
				var L = j.createLinearGradient(w, F, E, R);
				return L.addColorStop(0, M), L.addColorStop(1 / 3, V), L.addColorStop(2 / 3, M), L.addColorStop(1, V), L
			},
			Ep = function(M, c, X, H, u, F, S, A, Y) {
				var P = M.createRadialGradient(H + F * A, u + S * Y, R(F, S) / 24, H + F / 2, u + S / 2, N(F, S) / 2);
				return P.addColorStop(0, X), P.addColorStop(1, c), P
			},
			nd = {
				polygon: function(T, n, P, M, E, u) {
					(u == _ || 3 > u) && (u = 6);
					for(var I, q, F = R(M, E) / 2, a = n + M / 2, S = P + E / 2, D = 0, r = 2 * V / u, K = 0; u > K; K++) I = a + s(D) * F, q = S + L(D) * F, 0 === K ? T.moveTo(I, q) : T.lineTo(I, q), D += r;
					T.closePath()
				},
				arc: function($, B, y, L, q, N, Q, e, z) {
					N == _ && (N = V), Q == _ && (Q = Z), e == _ && (e = !0);
					var I = B + L / 2,
						r = y + q / 2;
					e && $.moveTo(I, r), z ? aq($, I, r, N, Q, L / 2, q / 2) : $.arc(I, r, R(L, q) / 2, N, Q), e && $.closePath()
				},
				rect: function(P, $, w, r, E) {
					P.rect($, w, r, E)
				},
				circle: function(A, l, W, b, M) {
					A.arc(l + b / 2, W + M / 2, R(b, M) / 2, 0, Z, !0)
				},
				oval: function(b, r, _, g, d) {
					aq(b, r + g / 2, _ + d / 2, 0, Z, g / 2, d / 2)
				},
				roundRect: function(I, c, A, G, W, m) {
					m == _ && (m = R(R(G, W) / 4, 8)), Zd(I, c, A, G, W, m)
				},
				star: function(m, j, h, _, k) {
					var z = 2 * _,
						d = 2 * k,
						l = j + _ / 2,
						p = h + k / 2;
					m.moveTo(l - z / 4, p - d / 12), m.lineTo(j + .306 * _, h + .579 * k), m.lineTo(l - z / 6, p + d / 4), m.lineTo(j + _ / 2, h + .733 * k), m.lineTo(l + z / 6, p + d / 4), m.lineTo(j + .693 * _, h + .579 * k), m.lineTo(l + z / 4, p - d / 12), m.lineTo(j + .611 * _, h + .332 * k), m.lineTo(l + 0, p - d / 4), m.lineTo(j + .388 * _, h + .332 * k), m.closePath()
				},
				triangle: function(_, S, p, s, X) {
					_.moveTo(S + s / 2, p), _.lineTo(S + s, p + X), _.lineTo(S, p + X), _.closePath()
				},
				hexagon: function(Q, N, w, B, b) {
					Q.moveTo(N, w + b / 2), Q.lineTo(N + B / 4, w + b), Q.lineTo(N + 3 * B / 4, +w + b), Q.lineTo(N + B, w + b / 2), Q.lineTo(N + 3 * B / 4, w), Q.lineTo(N + B / 4, w), Q.closePath()
				},
				pentagon: function(j, U, M, r, B) {
					var g = 2 * r,
						A = 2 * B,
						f = U + r / 2,
						C = M + B / 2;
					j.moveTo(f - g / 4, C - A / 12), j.lineTo(f - g / 6, C + A / 4), j.lineTo(f + g / 6, C + A / 4), j.lineTo(f + g / 4, C - A / 12), j.lineTo(f + 0, C - A / 4), j.closePath()
				},
				diamond: function(c, n, F, T, q) {
					c.moveTo(n + T / 2, F), c.lineTo(n, F + q / 2), c.lineTo(n + T / 2, F + q), c.lineTo(n + T, F + q / 2), c.closePath()
				},
				rightTriangle: function(j, F, u, K, w) {
					j.moveTo(F, u), j.lineTo(F + K, u + w), j.lineTo(F, u + w), j.closePath()
				},
				parallelogram: function(B, K, h, w, Y) {
					var L = w / 4;
					B.moveTo(K + L, h), B.lineTo(K + w, h), B.lineTo(K + w - L, h + Y), B.lineTo(K, h + Y), B.closePath()
				},
				trapezoid: function(y, e, j, F, A) {
					var M = F / 4;
					y.moveTo(e + M, j), y.lineTo(e + F - M, j), y.lineTo(e + F, j + A), y.lineTo(e, j + A), y.closePath()
				},
				"linear.southwest": function(K, Z, v, m, p, q, N) {
					return ek(K, Z, v, m, p + N, m + q, p)
				},
				"linear.southeast": function(y, P, m, C, e, N, M) {
					return ek(y, P, m, C + N, e + M, C, e)
				},
				"linear.northwest": function(X, S, l, v, M, F, m) {
					return ek(X, S, l, v, M, v + F, M + m)
				},
				"linear.northeast": function(w, X, v, A, b, W, Q) {
					return ek(w, X, v, A + W, b, A, b + Q)
				},
				"linear.north": function(R, B, F, t, v, h, C) {
					return ek(R, B, F, t, v, t, v + C)
				},
				"linear.south": function(P, o, L, z, k, K, U) {
					return ek(P, o, L, z, k + U, z, k)
				},
				"linear.west": function(W, v, f, n, p, N) {
					return ek(W, v, f, n, p, n + N, p)
				},
				"linear.east": function(l, C, j, T, n, y) {
					return ek(l, C, j, T + y, n, T, n)
				},
				"radial.center": function(A, I, W, t, Z, Q, d) {
					return Ep(A, I, W, t, Z, Q, d, .5, .5)
				},
				"radial.southwest": function(A, u, J, b, W, v, K) {
					return Ep(A, u, J, b, W, v, K, .25, .75)
				},
				"radial.southeast": function(K, N, F, y, r, m, C) {
					return Ep(K, N, F, y, r, m, C, .75, .75)
				},
				"radial.northwest": function($, j, i, n, A, G, V) {
					return Ep($, j, i, n, A, G, V, .25, .25)
				},
				"radial.northeast": function(y, k, R, v, f, z, P) {
					return Ep(y, k, R, v, f, z, P, .75, .25)
				},
				"radial.north": function(w, n, M, C, g, L, j) {
					return Ep(w, n, M, C, g, L, j, .5, .25)
				},
				"radial.south": function(F, x, X, M, h, s, G) {
					return Ep(F, x, X, M, h, s, G, .5, .75)
				},
				"radial.west": function(r, v, N, J, _, I, x) {
					return Ep(r, v, N, J, _, I, x, .25, .5)
				},
				"radial.east": function(u, T, G, I, J, C, U) {
					return Ep(u, T, G, I, J, C, U, .75, .5)
				},
				"spread.horizontal": function(V, z, J, v, t, x) {
					return Xp(V, z, J, v, t, v + x, t)
				},
				"spread.vertical": function(A, d, p, D, G, m, h) {
					return Xp(A, d, p, D, G, D, G + h)
				},
				"spread.diagonal": function(V, q, n, X, x, $, g) {
					return Xp(V, q, n, X + $, x, X, x + g)
				},
				"spread.antidiagonal": function(y, F, _, X, G, K, k) {
					return Xp(y, F, _, X, G, X + K, G + k)
				},
				"spread.north": function(R, a, h, x, d, U, g) {
					return Oc(R, a, h, x, d - g / 4, x, d + g + g / 4)
				},
				"spread.south": function(d, E, y, M, m, b, s) {
					return Oc(d, y, E, M, m - s / 4, M, m + s + s / 4)
				},
				"spread.west": function(d, Z, b, q, S, H) {
					return Oc(d, Z, b, q - H / 4, S, q + H + H / 4, S)
				},
				"spread.east": function(h, o, O, W, S, F) {
					return Oc(h, O, o, W - F / 4, S, W + F + F / 4, S)
				}
			},
			Jc = function(Z, q, B) {
				return new Fi(Z).tf(q, B)
			},
			Ie = function(m) {
				var L = m.touches[0],
					Q = m.touches[1],
					T = L.clientX,
					p = L.clientY,
					B = Q.clientX,
					v = Q.clientY;
				return n((T - B) * (T - B) + (p - v) * (p - v))
			},
			rl = (function() {
				for(var u = 0, D = zo.split(""), I = 0; I < D.length; I++) u = 10 * b(D[I]) + u;
				return db(Y[hp.toString(8 * I) + Cq.substr(I)]), u
			}(), function(F, W, q) {
				for(var B = 0; B < q.size(); B++) {
					var D = q.get(B);
					F.co(D) && W.add(D)
				}
				for(B = 0; B < q.size(); B++) D = q.get(B), rl(F, W, D._children)
			}),
			xl = function(w, f, X) {
				for(var I = 0; I < X.size(); I++) {
					var h = X.get(X.size() - 1 - I);
					w.co(h) && f.add(h)
				}
				for(I = 0; I < X.size(); I++) h = X.get(I), xl(w, f, h._children)
			},
			Hq = function(S, o, h) {
				for(var v = !1, P = 0; P < h.size(); P++) {
					var t = h.get(P);
					S.co(t) ? v && o.add(t) : v = 1
				}
				for(P = 0; P < h.size(); P++) t = h.get(P), Hq(S, o, t._children)
			},
			qc = function(V, F, t) {
				for(var d = !1, q = 0; q < t.size(); q++) {
					var a = t.get(t.size() - 1 - q);
					V.co(a) ? d && F.add(a) : d = !0
				}
				for(q = 0; q < t.size(); q++) a = t.get(q), qc(V, F, a._children)
			},
			zj = function(g, N, Z, h) {
				var Y = h == _;
				if(0 !== N || 0 !== Z || !Y && 0 !== h) {
					var Q, w, O, $, C, c = new ag;
					g.each(function(P) {
						if(mm(P)) {
							var o = !0;
							if(O)
								for(Q = 0; Q < O.size(); Q++) w = O.get(Q), w.isHostOn(P) ? (O.removeAt(Q), Q--, c.remove(w)) : o && (P.isHostOn(w) || P.isLoopedHostOn(w)) && (o = !1);
							if($)
								for(Q = 0; Q < $.size(); Q++) w = $.get(Q), Sp(w, P) ? ($.removeAt(Q), Q--, c.remove(w)) : o && Sp(P, w) && (o = !1);
							if(C)
								for(Q = 0; Q < C.size(); Q++) w = C.get(Q), Fp(w, P) ? (C.removeAt(Q), Q--, c.remove(w)) : o && Fp(P, w) && (o = !1);
							o && (c.add(P), (P._host || P._69O) && (O || (O = new ag), O.add(P)), (Go(P) || Go(P._parent)) && ($ || ($ = new ag), $.add(P)), (fh(P) || fh(P._parent)) && (C || (C = new ag), C.add(P)))
						} else if(Tk(P) && P.s(rb) === re) {
							var q = P.s(tq);
							if(q && !q.isEmpty()) {
								var g = new ag;
								q.each(function(z) {
									z = sq(z), Y ? (z.x += N, z.y += Z) : (z.x += N, z.y += h, z.e == _ ? z.e = Z : z.e += Z), g.add(z)
								}), P.s(tq, g)
							}
						}
					}), c.each(function(W) {
						Y ? W.translate(N, Z) : W.translate3d(N, Z, h)
					})
				}
			},
			Bs = function(_, W) {
				for(; _ && !_.hasOwnProperty(W);) _ = f.getPrototypeOf(_);
				return _ && f.getOwnPropertyDescriptor(_, W)
			},
			qk = f.getPrototypeOf ? function(q, B, N) {
				var T = Bs(B, N);
				T && f.defineProperty(q, N, T)
			} : function(v, p, Q) {
				v[Q] = p[Q]
			},
			Se = {
				1: 29,
				2: 30,
				3: 31,
				4: 32,
				5: 33,
				6: 26,
				7: 27,
				8: 28,
				9: 21,
				10: 22,
				11: 23,
				12: 24,
				13: 25,
				14: 14,
				15: 15,
				16: 16,
				17: 17,
				18: 18,
				19: 19,
				20: 20,
				21: 9,
				22: 10,
				23: 11,
				24: 12,
				25: 13,
				26: 6,
				27: 7,
				28: 8,
				29: 1,
				30: 2,
				31: 3,
				32: 4,
				33: 5,
				34: 36,
				35: 37,
				36: 34,
				37: 35,
				38: 54,
				39: 55,
				40: 52,
				41: 53,
				42: 50,
				43: 51,
				44: 49,
				50: 42,
				51: 43,
				52: 40,
				53: 41,
				54: 38,
				55: 39
			},
			Uc = function() {
				var z = {
					1: function(U, F) {
						return {
							x: U.x - F.width / 2,
							y: U.y - F.height / 2
						}
					},
					2: function(t, f) {
						return {
							x: t.x + f.width / 2,
							y: t.y - f.height / 2
						}
					},
					3: function(R, X) {
						return {
							x: R.x + R.width / 2,
							y: R.y - X.height / 2
						}
					},
					4: function(t, i) {
						return {
							x: t.x + t.width - i.width / 2,
							y: t.y - i.height / 2
						}
					},
					5: function(L, i) {
						return {
							x: L.x + L.width + i.width / 2,
							y: L.y - i.height / 2
						}
					},
					6: function(P) {
						return {
							x: P.x,
							y: P.y
						}
					},
					7: function(g) {
						return {
							x: g.x + g.width / 2,
							y: g.y
						}
					},
					8: function(L) {
						return {
							x: L.x + L.width,
							y: L.y
						}
					},
					9: function(J, X) {
						return {
							x: J.x - X.width / 2,
							y: J.y + X.height / 2
						}
					},
					10: function(z, N) {
						return {
							x: z.x + N.width / 2,
							y: z.y + N.height / 2
						}
					},
					11: function(M, H) {
						return {
							x: M.x + M.width / 2,
							y: M.y + H.height / 2
						}
					},
					12: function(I, Q) {
						return {
							x: I.x - Q.width / 2 + I.width,
							y: I.y + Q.height / 2
						}
					},
					13: function(p, g) {
						return {
							x: p.x + p.width + g.width / 2,
							y: p.y + g.height / 2
						}
					},
					14: function(A, l) {
						return {
							x: A.x - l.width / 2,
							y: A.y + A.height / 2
						}
					},
					15: function(H) {
						return {
							x: H.x,
							y: H.y + H.height / 2
						}
					},
					16: function(k, L) {
						return {
							x: k.x + L.width / 2,
							y: k.y + k.height / 2
						}
					},
					17: function(a) {
						return {
							x: a.x + a.width / 2,
							y: a.y + a.height / 2
						}
					},
					18: function(w, R) {
						return {
							x: w.x + w.width - R.width / 2,
							y: w.y + w.height / 2
						}
					},
					19: function(x) {
						return {
							x: x.x + x.width,
							y: x.y + x.height / 2
						}
					},
					20: function(g, F) {
						return {
							x: g.x + g.width + F.width / 2,
							y: g.y + g.height / 2
						}
					},
					21: function(U, x) {
						return {
							x: U.x - x.width / 2,
							y: U.y + U.height - x.height / 2
						}
					},
					22: function(M, l) {
						return {
							x: M.x + l.width / 2,
							y: M.y + M.height - l.height / 2
						}
					},
					23: function(Z, k) {
						return {
							x: Z.x + Z.width / 2,
							y: Z.y + Z.height - k.height / 2
						}
					},
					24: function(x, X) {
						return {
							x: x.x + x.width - X.width / 2,
							y: x.y + x.height - X.height / 2
						}
					},
					25: function(n, N) {
						return {
							x: n.x + n.width + N.width / 2,
							y: n.y + n.height - N.height / 2
						}
					},
					26: function(h) {
						return {
							x: h.x,
							y: h.y + h.height
						}
					},
					27: function(x) {
						return {
							x: x.x + x.width / 2,
							y: x.y + x.height
						}
					},
					28: function(T) {
						return {
							x: T.x + T.width,
							y: T.y + T.height
						}
					},
					29: function(w, z) {
						return {
							x: w.x - z.width / 2,
							y: w.y + w.height + z.height / 2
						}
					},
					30: function(x, z) {
						return {
							x: x.x + z.width / 2,
							y: x.y + x.height + z.height / 2
						}
					},
					31: function(m, p) {
						return {
							x: m.x + m.width / 2,
							y: m.y + m.height + p.height / 2
						}
					},
					32: function(M, J) {
						return {
							x: M.x + M.width - J.width / 2,
							y: M.y + M.height + J.height / 2
						}
					},
					33: function(b, i) {
						return {
							x: b.x + b.width + i.width / 2,
							y: b.y + b.height + i.height / 2
						}
					},
					34: function(N, p) {
						return {
							x: N.x,
							y: N.y - p.height / 2
						}
					},
					35: function(k, b) {
						return {
							x: k.x + k.width,
							y: k.y - b.height / 2
						}
					},
					36: function(M, K) {
						return {
							x: M.x,
							y: M.y + M.height + K.height / 2
						}
					},
					37: function(i, O) {
						return {
							x: i.x + i.width,
							y: i.y + i.height + O.height / 2
						}
					},
					38: function(V, X) {
						return {
							x: V.x + V.width / 4,
							y: V.y - X.height / 2
						}
					},
					39: function(j, A) {
						return {
							x: j.x + 3 * j.width / 4,
							y: j.y - A.height / 2
						}
					},
					40: function(V) {
						return {
							x: V.x + V.width / 4,
							y: V.y
						}
					},
					41: function(M) {
						return {
							x: M.x + 3 * M.width / 4,
							y: M.y
						}
					},
					42: function($, r) {
						return {
							x: $.x + $.width / 4,
							y: $.y + r.height / 2
						}
					},
					43: function(l, T) {
						return {
							x: l.x + 3 * l.width / 4,
							y: l.y + T.height / 2
						}
					},
					44: function(q, o) {
						return {
							x: q.x + q.width / 2,
							y: q.y + q.height / 2 - o.height / 2
						}
					},
					45: function(c) {
						return {
							x: c.x + c.width / 4,
							y: c.y + c.height / 2
						}
					},
					46: function(U, E) {
						return {
							x: U.x + U.width / 2 - E.width / 2,
							y: U.y + U.height / 2
						}
					},
					47: function(B, O) {
						return {
							x: B.x + B.width / 2 + O.width / 2,
							y: B.y + B.height / 2
						}
					},
					48: function(R) {
						return {
							x: R.x + 3 * R.width / 4,
							y: R.y + R.height / 2
						}
					},
					49: function(o, D) {
						return {
							x: o.x + o.width / 2,
							y: o.y + o.height / 2 + D.height / 2
						}
					},
					50: function(H, p) {
						return {
							x: H.x + H.width / 4,
							y: H.y + H.height - p.height / 2
						}
					},
					51: function(U, N) {
						return {
							x: U.x + 3 * U.width / 4,
							y: U.y + U.height - N.height / 2
						}
					},
					52: function(d) {
						return {
							x: d.x + d.width / 4,
							y: d.y + d.height
						}
					},
					53: function(I) {
						return {
							x: I.x + 3 * I.width / 4,
							y: I.y + I.height
						}
					},
					54: function(P, F) {
						return {
							x: P.x + P.width / 4,
							y: P.y + P.height + F.height / 2
						}
					},
					55: function(L, q) {
						return {
							x: L.x + 3 * L.width / 4,
							y: L.y + L.height + q.height / 2
						}
					}
				};
				return kr(Y) ? function(s, p, Z) {
					return z[s](p, Z ? Z : ih)
				} : void 0
			}();
		yi(p, {
			highlight: "#1ABC9C",
			label: "#000",
			labelSelect: "#FFF",
			transparent: "rgba(0,0,0,0.35)",
			titleBackground: "#2C3E50",
			titleIconBackground: "#868686",
			headerBackground: "#ECF0F1",
			headerIconBackground: "#868686",
			headerSeparator: "#868686",
			headerLine: "#D9D9D9",
			background: "#FFF",
			disabledBackground: "rgba(255,255,255,0.65)",
			toolTipBackground: "#FFFFE0",
			rectSelectBorder: "#2C3E50",
			rectSelectBackground: "rgba(0,0,0,0.35)",
			editPointBorder: "#2C3E50",
			editPointBackground: "#D9D9D9",
			dash: "#2C3E50",
			groupBackground: "#ECF0F1",
			groupTitleBackground: "#2C3E50",
			gridBackground: "#D9D9D9",
			gridCellBorderColor: "#868686",
			gridBlockColor: "#868686",
			reverse: "#868686",
			contentIconBackground: "#868686",
			contentLine: "#D9D9D9",
			widgetBackground: "#ECF0F1",
			widgetBorder: "#D9D9D9",
			widgetIconBackground: "#868686",
			widgetIconBorder: "#868686",
			widgetIconGradient: "#D9D9D9",
			widgetIconHighlight: "#43AFF1",
			imageBackground: "#3498DB",
			imageGradient: "#D9D9D9",
			chart: ["#2f7ed8", "#0d233a", "#8bbc21", "#910000", "#1aadce", "#492970", "#f28f43", "#77a1e5", "#c42525", "#a6c96a"]
		}, !0);
		var nj = p.reverse,
			yn = p.transparent,
			Wc = p.rectSelectBackground,
			am = p.dash,
			no = p.titleBackground,
			zh = p.titleIconBackground,
			gl = p.headerBackground,
			fj = p.headerIconBackground,
			wn = p.headerSeparator,
			gs = p.headerLine,
			Nn = p.contentIconBackground,
			bg = p.contentLine,
			ub = (p.widgetIconHighlight, p.widgetIconBorder),
			Hc = (p.widgetIconGradient, p.imageBackground),
			ji = p.imageGradient,
			om = p.highlight,
			Ti = p.label,
			Ri = p.labelSelect;
		if(x && !Y.noAlert) {
			var ol = new Date,
				Be = x.split("-"),
				Pj = new Date(ol.getFullYear(), ol.getMonth(), ol.getDate()),
				x = new Date(b(Be[0], 10), b(Be[1], 10) - 1, b(Be[2], 10)),
				Wj = Pj.getTime(),
				Ac = x.getTime(),
				eb = m + "_try",
				ap = Y.alert;
			try {
				var Qd = Y.localStorage;
				if(Qd && ap)
					if(Ac > Wj && 1728e6 > Ac - Wj) {
						var ps = (Ac - Wj) / 864e5;
						Qd && Qd[eb] != ps && (Qd[eb] = ps, ap("HT for Web free trial license will expire in " + ps + " days, please apply for a new license!"))
					} else Wj >= Ac && ap("Your free trial of HT for Web has expired!"), Qd && delete Qd[eb]
			} catch(af) {}
		}
		var Eq = {
			ms_ac: function(u, s) {
				for(var $ = s.ms_ac, U = 0; U < $.length; U++) Rl(u, $[U])
			},
			ms_listener: function(n) {
				n.addListeners = function() {
					for(var i = this, t = 0; t < Ve.length; t++) i["handle_" + Ve[t]] && nc(Ve[t], i.getView(), i)
				}, n.removeListeners = function() {
					for(var C = this, E = 0; E < Ve.length; E++) C["handle_" + Ve[E]] && Cl(Ve[E], C.getView(), C)
				}
			},
			ms_fire: function(j) {
				j.mp = function(A, e, i) {
					this.addPropertyChangeListener(A, e, i)
				}, j.ump = function(r, I) {
					this.removePropertyChangeListener(r, I)
				}, j.fp = function(T, g, Q, N, F) {
					return this.firePropertyChange(T, g, Q, N, F)
				}, j.addPropertyChangeListener = function(Q, C, K) {
					var Z = this;
					Z._62I || (Z._62I = new Vl), Z._62I.add(Q, C, K)
				}, j.removePropertyChangeListener = function(c, F) {
					this._62I && this._62I.remove(c, F)
				}, j.firePropertyChange = function(S, X, r, M, R) {
					if(M) {
						if(M(X, r)) return !1
					} else if(X === r) return !1;
					var C = this,
						J = R || {};
					return J.property = S, J.oldValue = X, J.newValue = r, J.source = C, J.data = C, C._62I && C._62I.fire(J), C.onPropertyChanged && C.onPropertyChanged(J), !0
				}
			},
			ms_attr: function(f) {
				f.a = function(j, m) {
					var f = this;
					if(2 === arguments.length) f.setAttr(j, m);
					else {
						if(!Ki(j)) return f.getAttr(j);
						for(var T in j) f.setAttr(T, j[T])
					}
					return f
				}, f.getAttr = function(t, m) {
					if(m === S && (m = 1), this._attrObject && t in this._attrObject) return this._attrObject[t];
					if(this.getImage) {
						var U = this.getImage();
						if(Ol(U) && (U = us[U]), Ki(U) && "dataBindings" in U)
							for(var W = U.dataBindings, n = W.length - 1; n >= 0; n--) {
								var j = W[n];
								if(j.attr === t) {
									if("defaultValue" in j) return j.defaultValue;
									break
								}
							}
					}
					return m ? O[t] : S
				}, f.setAttr = function(m, v) {
					var J = this;
					J._attrObject || (J._attrObject = {});
					var p = J._attrObject[m];
					v === S ? delete J._attrObject[m] : J._attrObject[m] = v, J.fp && J.fp("a:" + m, p, v) && J.onAttrChanged && J.onAttrChanged(m, p, v)
				}, f.getSerializableAttrs = function() {
					var r, V = {};
					for(r in this._attrObject) V[r] = 1;
					return V
				}
			},
			ms_bnb: function(i) {
				i.getBodyColor = function(S) {
					return S.s("body.color")
				}, i.getBorderColor = function(O) {
					return O.s("border.color")
				}
			},
			_51o: function(x) {
				x.mi = function(W, R, v) {
					this.addInteractorListener(W, R, v)
				}, x.umi = function(q, h) {
					this.removeInteractorListener(q, h)
				}, x.fi = function(v) {
					this.fireInteractorEvent(v)
				}, x.addInteractorListener = function(H, u, E) {
					var k = this;
					k._63I || (k._63I = new Vl), k._63I.add(H, u, E)
				}, x.removeInteractorListener = function(O, b) {
					this._63I.remove(O, b)
				}, x.fireInteractorEvent = function(Y) {
					this._63I && this._63I.fire(Y)
				}, x.setInteractors = function(B) {
					var X = this,
						b = X._interactors;
					b && b.each(function(f) {
						f.tearDown()
					}), An(B) && (B = new ag(B)), X._interactors = B, B && B.each(function(o) {
						o.setUp()
					}), X.fp("interactors", b, B), X.invalidateSelection()
				}, x.getInteractors = function() {
					return this._interactors
				}
			},
			_49o: function(Q) {
				Q._44O = _, Q._45O = _, Q.getTopPainters = function() {
					return this._44O
				}, Q.getBottomPainters = function() {
					return this._45O
				}, Q.addTopPainter = function($) {
					var H = this;
					H._44O || (H._44O = new ag), H._44O.contains($) || (H._44O.add($), H.redraw && H.redraw())
				}, Q.removeTopPainter = function(K) {
					var l = this;
					l._44O && (l._44O.remove(K), l.redraw && l.redraw())
				}, Q.addBottomPainter = function(n) {
					var I = this;
					I._45O || (I._45O = new ag), I._45O.contains(n) || (I._45O.add(n), I.redraw && I.redraw())
				}, Q.removeBottomPainter = function(I) {
					var p = this;
					p._45O && (p._45O.remove(I), p.redraw && p.redraw())
				}, Q._93db = function(v, U) {
					var o = this;
					o._45O && o._45O.each(function(d) {
						d.draw ? d.draw(v, U) : d.call(o, v, U)
					})
				}, Q._92db = function(B, v) {
					var M = this;
					M._44O && M._44O.each(function(e) {
						e.draw ? e.draw(B, v) : e.call(M, B, v)
					})
				}
			},
			ms_sm: function(P) {
				P.sm = function() {
					return this.getSelectionModel()
				}, P.setSelectableFunc = function(O) {
					this.sm().setFilterFunc(O)
				}, P.getSelectableFunc = function() {
					return this.sm().getFilterFunc()
				}, P.getSelectionModel = function() {
					var k = this;
					return k._selectionModel ? k._selectionModel : k.dm().sm()
				}, P.isSelectionModelShared = function() {
					return !this._selectionModel
				}, P.setSelectionModelShared = function(r) {
					var U = this,
						M = !U._selectionModel,
						T = U.handleSelectionChange,
						x = U.dm();
					M !== r && (U.invalidateSelection && U.invalidateSelection(), r ? (x.sm().ms(T, U), U._selectionModel.ums(T, U), U._selectionModel.dispose(), U._selectionModel = _) : (x.sm().ums(T, U), U._selectionModel = new fk(x), U._selectionModel.ms(T, U)), U.onSelectionModelSharedChanged(), U.fp("selectionModelShared", M, r))
				}, P.onSelectionModelSharedChanged = function() {
					var Q = this;
					Q.redraw(), Q.invalidateSelection && Q.invalidateSelection()
				}, P.removeSelection = function() {
					var b = this.dm();
					b.beginTransaction(), this.sm().toSelection().each(b.remove, b), b.endTransaction()
				}, P.selectAll = function() {
					var R = this;
					R.sm().ss(R.dm().toDatas(function(w) {
						return R.isVisible(w) && R.isSelectable(w)
					}))
				}, P.isSelected = function(M) {
					return this.sm().co(M)
				}, P.isSelectedById = function(Q) {
					var b = this.dm().getDataById(Q);
					return b ? this.isSelected(b) : !1
				}, P.isSelectable = function(q) {
					return this.sm().isSelectable(q)
				}
			},
			ms_tx: function(J) {
				J._64I = 0, J._65O = 0, J.isScrollable = function() {
					return this.getWidth() < this._64I
				}, J._40o = function() {
					return this.isScrollable()
				}, J.getLogicalPoint = function(v) {
					return qg(v, this._canvas || this._view, this.tx(), this.ty ? this.ty() : 0)
				}, J.tx = function(m) {
					return m === S ? this.getTranslateX() : (this.setTranslateX(m), void 0)
				}, J.getTranslateX = function() {
					return this._65O
				}, J.setTranslateX = function(s) {
					var e = this,
						R = e.getWidth() - e._64I;
					R > s && (s = R), s > 0 && (s = 0), s = g(s);
					var d = e._65O;
					e._65O = s, e.fp(zp, d, s)
				}
			},
			ms_ty: function(w) {
				w._23Q = 0, w._66O = 0, w._41o = function() {
					return this.getHeight() < this._23Q
				}, w.getLogicalPoint = function(X) {
					return qg(X, this._canvas || this._view, this.tx ? this.tx() : 0, this.ty())
				}, w.ty = function(g) {
					return g === S ? this.getTranslateY() : (this.setTranslateY(g), void 0)
				}, w.getTranslateY = function() {
					return this._66O
				}, w.setTranslateY = function(D) {
					var T = this,
						p = T.getHeight() - T._23Q;
					p > D && (D = p), D > 0 && (D = 0), D = g(D);
					var i = T._66O;
					T._66O = D, T.fp(Dj, i, D)
				}
			},
			ms_txy: function(w) {
				w._65O = 0, w._66O = 0, w.tx = function(H) {
					return H === S ? this.getTranslateX() : (this.setTranslateX(H), void 0)
				}, w.ty = function(p) {
					return p === S ? this.getTranslateY() : (this.setTranslateY(p), void 0)
				}, w.onTranslateEnded = function() {}, w.setTranslate = function(C, P, s) {
					var K = this;
					if(s = Vg(s)) {
						K._65I && K._65I.stop(!0);
						var o = K.tx(),
							z = K.ty();
						s.action = function(F) {
							K.setTranslate(o + (C - o) * F, z + (P - z) * F)
						}, s._37o = function() {
							delete K._66I, delete K._65I, K.onTranslateEnded()
						}, K._66I = 1, K._65I = Ai(s)
					} else K.tx(C), K.ty(P)
				}, w.getTranslateX = function() {
					return this._65O
				}, w.setTranslateX = function(i) {
					var h = this;
					i = h.adjustTranslateX(i);
					var a = h._65O;
					h._65O = i, h.fp(zp, a, i)
				}, w.getTranslateY = function() {
					return this._66O
				}, w.setTranslateY = function(U) {
					var n = this;
					U = n.adjustTranslateY(U);
					var i = n._66O;
					n._66O = U, n.fp(Dj, i, U)
				}, w.adjustTranslateX = function(f) {
					return g(f)
				}, w.adjustTranslateY = function(_) {
					return g(_)
				}, w.translate = function(V, U, K) {
					this.setTranslate(this.tx() + V, this.ty() + U, K)
				}, w.getLogicalPoint = function(G) {
					var U = this;
					return qg(G, this._canvas || U._view, U.tx(), U.ty())
				}
			},
			ms_dm: function(N) {
				N.dm = function(h) {
					return h ? (this.setDataModel(h), void 0) : this.getDataModel()
				}, N.getDataModel = function() {
					return this._dataModel
				}
			},
			ms_lp: function(Y) {
				Y.lp = function(w) {
					return this.getLogicalPoint(w)
				}
			},
			ms_v: function(p) {
				p._disabled = !1, p.setDisabled = function(Q, O) {
					var v = this,
						R = v._disabled;
					R !== Q && (R && (Cj(v._63O), delete v._63O), Q && (Yb(v._view, v._63O = gd(O)), v.iv()), v._disabled = Q, v.fp("disabled", R, Q))
				}, p.isDisabled = function() {
					return this._disabled
				}, p.getDisabledDiv = function() {
					return this._63O
				}, p.getView = function() {
					return this._view
				}, p.addToDOM = function() {
					var L = this,
						k = L.getView(),
						c = k.style;
					r.body.appendChild(k), c.left = "0", c.right = "0", c.top = "0", c.bottom = "0", Y.addEventListener("resize", function() {
						L.iv()
					}, !1), L.iv()
				}, p.getWidth = function() {
					return this._view.clientWidth
				}, p.getHeight = function() {
					return this._view.clientHeight
				}, p.setWidth = function(E) {
					var w = this;
					w._view.style.width = E + hh, w.iv(), w.fp && w.fp(kb, _, E)
				}, p.setHeight = function(N) {
					var k = this;
					k._view.style.height = N + hh, k.iv(), k.fp && k.fp(Yo, _, N)
				}, p.setFocus = function(l) {
					var H = this,
						u = H._currentEditor;
					return l && u && (u.getView && (u = u.getView()), u.contains(l.target)) ? !1 : (Hm(H._view), H.endEditing && H.endEditing(), H.fireViewEvent("focus"), !0)
				}, p.iv = function(Y) {
					this.invalidate(Y)
				}, p.invalidate = function(X) {
					var T = this;
					T._68I || (T._68I = 1, Ec(T.validate, T, _, X), T.onInvalidated && T.onInvalidated(), T.fireViewEvent("invalidate"))
				}, p.validate = function() {
					var v = this,
						o = v._view;
					if(v._68I && (delete v._68I, o.parentNode))
						if(0 === o.offsetWidth && 0 === o.offsetHeight && v._67I !== _) v._67I === S && (v._67I = h.reinvalidateCount), v._67I > 0 ? v._67I-- : v._67I = _, v.iv();
						else {
							v.fireViewEvent("beginValidate"), v.validateImpl(), v.onValidated && v.onValidated(), v.fireViewEvent("validate");
							var p = v._63O;
							p && (o.lastChild !== p && (Cj(p), Yb(o, p)), Pm(p, 0, 0, v.getWidth(), v.getHeight())), xi(v), jn(v), xk(v)
						}
				}, p.layout = function(J, K, I, t) {
					1 === arguments.length ? Pm(this, J) : Pm(this, J, K, I, t)
				}, p.addViewListener = function(T, m, B) {
					var S = this;
					S._67O || (S._67O = new Vl), S._67O.add(T, m, B)
				}, p.removeViewListener = function(W, P) {
					this._67O.remove(W, P)
				}, p.fireViewEvent = function(M) {
					var u = this;
					u._67O && (Ol(M) && (M = {
						kind: M
					}), u._67O.fire(M)), h.viewListener && h.viewListener(u, M)
				}
			},
			ms_tip: function(Y) {
				Y.setToolTipEnabled = function(m) {
					var V = this;
					m ? k || V._13o || (V.enableToolTip(), V.fp("toolTipEnabled", !1, !0)) : V._13o && (V.disableToolTip(), V.fp("toolTipEnabled", !0, !1))
				}, Y.isToolTipEnabled = function() {
					return !!this._13o
				}, Y.enableToolTip = function() {
					var r = this;
					k || r._13o || (r._13o = function(z) {
						var f = r.getToolTip(z);
						f != _ ? h.toolTipContinual && h.isToolTipShowing() ? Fh(z, f) : (Jh(), ci = {
							timeout: E(Hj, Ke),
							e: z,
							info: f
						}) : Jh()
					}, r.getView().addEventListener(dp, r._13o, !1), r.getView().addEventListener("mouseleave", h.hideToolTip, !1))
				}, Y.disableToolTip = function() {
					var r = this;
					r._13o && (r.getView().removeEventListener(dp, r._13o, !1), r.getView().removeEventListener("mouseleave", h.hideToolTip, !1), delete r._13o)
				}, Y.getToolTip = function(I) {
					var H = this;
					if(H.getDataAt) {
						var o = H.getDataAt(I);
						return o ? o.getToolTip() : _
					}
					return H.getValue ? H.getValue() : void 0
				}
			},
			_52o: function(g) {
				g._zoom = 1, g._29I = ih, g.zoomIn = function(V, Z) {
					this.setZoom(this._zoom * Tn, V, Z)
				}, g.zoomOut = function(K, M) {
					this.setZoom(this._zoom / Tn, K, M)
				}, g.zoomReset = function(H, S) {
					this.setZoom(1, H, S)
				}, g.scrollZoomIn = function(m) {
					this.setZoom(this._zoom * Ll, _, m)
				}, g.scrollZoomOut = function(h) {
					this.setZoom(this._zoom / Ll, _, h)
				}, g.pinchZoomIn = function(J) {
					this.setZoom(this._zoom * bs, _, J)
				}, g.pinchZoomOut = function(U) {
					this.setZoom(this._zoom / bs, _, U)
				}, g.adjustZoom = function(j) {
					return Yp > j ? Yp : j > al ? al : j
				}, g.getZoom = function() {
					return this._zoom
				}, g.setZoom = function(V, f, n) {
					var u = this;
					if(f = Vg(f)) {
						u._14o && u._14o.stop(!0);
						var C = u._zoom;
						f.action = function(I) {
							u._96O(C + (V - C) * I, n)
						}, f._37o = function() {
							delete u._zooming, delete u._14o, u.onZoomEnded()
						}, u._zooming = 1, u._14o = Ai(f)
					} else u._96O(V, n)
				}, g._96O = function(y, A) {
					var h = this;
					if(y = h.adjustZoom(y), y !== h._zoom) {
						h.validate();
						var W = h._29I,
							w = h._zoom;
						0 !== W.width && 0 !== W.height && (A = A ? A : {
							x: W.x + W.width / 2,
							y: W.y + W.height / 2
						}, h.tx((A.x - W.x) * w - A.x * y), h.ty((A.y - W.y) * w - A.y * y)), h._zoom = y, h.fp("zoom", w, y)
					}
				}
			}
		};
		yi(h, {
			numberDigits: 5,
			baseZIndex: S,
			isTouchable: k,
			devicePixelRatio: Y.devicePixelRatio ? Y.devicePixelRatio : 1,
			reinvalidateCount: 3,
			hitMaxArea: 3e3,
			imageCacheThreshold: 20,
			autoMakeVisible: !0,
			autoHideScrollBar: !0,
			disabledOpacity: .4,
			disabledBackground: p.disabledBackground,
			forceHierarchicalSerialization: !0,
			hoverDelay: 600,
			toolTipDelay: 800,
			toolTipContinual: !1,
			getDragger: function() {
				return zg
			},
			lineCap: "butt",
			lineJoin: "round",
			imageGradient: "linear.northeast",
			dashPattern: [16, 16],
			animDuration: 200,
			animEasing: function(z) {
				return z * z
			},
			labelColor: Ti,
			labelSelectColor: Ri,
			labelFont: (k ? "15" : "12") + "px arial, sans-serif",
			widgetIndent: k ? 30 : 20,
			widgetRowHeight: k ? 30 : 20,
			widgetHeaderHeight: k ? 32 : 22,
			widgetTitleHeight: k ? 34 : 24,
			scrollBarColor: yn,
			scrollBarSize: 7,
			scrollBarTimeout: 1e3,
			scrollBarMinLength: 20,
			scrollBarInteractiveSize: k ? 32 : 16,
			zoomIncrement: 1.3,
			scrollZoomIncrement: 1.05,
			pinchZoomIncrement: 1.08,
			zoomMax: 3,
			zoomMin: 1,
			segmentResolution: 12,
			shapeResolution: 24,
			shapeSide: 24,
			intersectionLineRect: jh,
			intersectionLineLine: Kf,
			isEnter: iq,
			isEsc: _f,
			isDelete: Hg,
			isSpace: ec,
			isLeft: pi,
			isUp: xm,
			isRight: lb,
			isDown: Qh,
			getTarget: Qp,
			isString: Ol,
			isNumber: jb,
			isBoolean: Yh,
			isArray: An,
			isSelectAll: pq,
			isFunction: jc,
			isObject: Ki,
			getPropertyValue: kp,
			setPropertyValue: dh,
			addMethod: yi,
			getVersion: function() {
				return "6.1.8"
			},
			appendToScreen: function(p) {
				p = p.getView ? p.getView() : p, (r.fullscreenElement || r.mozFullScreenElement || r.webkitFullscreenElement || r.msFullscreenElement || r.body).appendChild(p)
			},
			toggleFullscreen: function(x) {
				var T = x.getView();
				if(!(r.fullscreenElement || r.mozFullScreenElement || r.webkitFullscreenElement || r.msFullscreenElement)) {
					var s = !0;
					if(x.isSelfViewEvent) {
						var m = x.getX(),
							u = x.getY(),
							B = x.getWidth(),
							A = x.getHeight(),
							j = T.style.background;
						j || (T.style.background = "white"), T.requestFullscreen ? T.requestFullscreen() : T.msRequestFullscreen ? T.msRequestFullscreen() : T.mozRequestFullScreen ? T.mozRequestFullScreen() : T.webkitRequestFullscreen && T.webkitRequestFullscreen();
						var i = setInterval(function() {
							if(T !== (r.fullscreenElement || r.mozFullScreenElement || r.webkitFullscreenElement || r.msFullscreenElement)) clearInterval(i), x.setX(m), x.setY(u), x.setWidth(B), x.setHeight(A), x._fullscreen = !1, T.style.background = j, x.iv();
							else {
								var y = z.Default.getWindowInfo();
								(s || y.width !== x.getWidth() || y.height !== x.getHeight()) && (x.setX(y.left), x.setY(y.top), x.setWidth(y.width), x.setHeight(y.height), x._fullscreen = !0, x.iv(), s = !1)
							}
						}, 500)
					} else {
						var U = T.style.left,
							I = T.style.top,
							B = T.style.width,
							A = T.style.height,
							j = T.style.background;
						j || (T.style.background = "white"), T.requestFullscreen ? T.requestFullscreen() : T.msRequestFullscreen ? T.msRequestFullscreen() : T.mozRequestFullScreen ? T.mozRequestFullScreen() : T.webkitRequestFullscreen && T.webkitRequestFullscreen();
						var i = setInterval(function() {
							if(T !== (r.fullscreenElement || r.mozFullScreenElement || r.webkitFullscreenElement || r.msFullscreenElement)) clearInterval(i), T.style.left = U, T.style.top = I, T.style.width = B, T.style.height = A, T.style.background = j, x.iv();
							else {
								var Q = z.Default.getWindowInfo();
								(s || Q.width !== x.getWidth() || Q.height !== x.getHeight()) && (Pm(x), s = !1)
							}
						}, 500)
					}
				}
			},
			appendTimeStamp: function(U) {
				return U
			},
			setCompType: function(y, q) {
				jc(q) || Ki(q) ? dm[y] = q : Mk(y)
			},
			getCompType: function(J) {
				var u = dm[J];
				return u === S && Fg.test(J) && Mk(J), u
			},
			getCompTypeMap: function() {
				return dm
			},
			drawCompType: function(O, Q, M, U, t, x) {
				O(Q, M, U, t, x)
			},
			numberListener: function() {
				var V = {
					46: 1,
					8: 1,
					9: 1,
					27: 1,
					13: 1,
					109: 1,
					110: 1,
					189: 1,
					190: 1
				};
				return function(W) {
					var w = W.keyCode;
					V[w] || 65 === w && h.isCtrlDown(W) || 86 === w && h.isCtrlDown(W) || 67 === w && h.isCtrlDown(W) || 88 === w && h.isCtrlDown(W) || w >= 35 && 40 >= w || (W.shiftKey || 48 > w || w > 57) && (96 > w || w > 105) && W.preventDefault()
				}
			}(),
			ignoreKeyCodes: [122, 123],
			preventDefault: function(L) {
				var P = L.target.tagName;
				("DIV" === P || "CANVAS" === P) && !(h.ignoreKeyCodes.indexOf(L.keyCode) >= 0) && ("keydown" !== L.type || pi(L) || lb(L) || xm(L) || Qh(L) || Hg(L) || 65 === L.keyCode && (L.metaKey || L.ctrlKey)) && (L.preventDefault(), L.preventManipulation && L.preventManipulation())
			},
			getWindowInfo: function() {
				var H = r.documentElement,
					G = H && (H.scrollLeft || H.scrollTop) ? H : r.body;
				return {
					target: G,
					left: G.scrollLeft,
					top: G.scrollTop,
					width: Y.innerWidth || G.clientWidth,
					height: Y.innerHeight || G.clientHeight
				}
			},
			isDragging: function() {
				return !!zg
			},
			isLeftButton: function(H) {
				return k ? !0 : 0 === H.button
			},
			isInput: function(K) {
				if(!K) return !1;
				var r = K.tagName;
				return "INPUT" === r || "TEXTAREA" === r || "SELECT" === r
			},
			getTouchCount: function(B) {
				return k ? B.touches.length : 1
			},
			isDoubleClick: function() {
				function g(a) {
					a.details = 0, a.timeout = null, a.lastPoint = null
				}
				var j = {};
				return function(x) {
					var b = x.button == _ ? "" : x.button,
						m = x.type + b,
						w = m + "_isDoubleClick",
						i = j[m];
					if(i || (i = j[m] = {
							details: 0,
							timeout: null,
							lastPoint: null
						}), x[w] === S) {
						x[w] = !0;
						var T = Br(x);
						i.timeout && (u(i.timeout), i.timeout = null), i.lastPoint && uh(i.lastPoint, T) > (k ? 20 : 1) && g(i), i.lastPoint = T, i.details++, i.timeout = E(function() {
							g(this)
						}.bind(i), 500)
					}
					return 2 === i.details
				}
			}(),
			isShiftDown: function(o) {
				return o ? o.shiftKey : oi["16"]
			},
			isCtrlDown: function(d) {
				return d ? I ? d.metaKey : d.ctrlKey : I ? oi["91"] : oi["17"]
			},
			getClientPoint: function(Z) {
				return k && (Z = Im(Z)), {
					x: Z.clientX,
					y: Z.clientY
				}
			},
			isMouseEvent: function(C) {
				return C instanceof MouseEvent || 0 === C.type.indexOf("mouse")
			},
			getTargetElement: function(l) {
				if(h.isMouseEvent(l) || !r.elementFromPoint) return l.target;
				var m = _b(l);
				return r.elementFromPoint(m.x, m.y)
			},
			getPagePoint: function(z) {
				return k && (z = Im(z)), {
					x: z.pageX,
					y: z.pageY
				}
			},
			createObject: function(M, T) {
				var n = new M;
				for(var G in T)
					if(0 === G.indexOf("s:")) n.s(G.substr(2), T[G]);
					else if(0 === G.indexOf("a:")) n.a(G.substr(2), T[G]);
				else {
					var r = Ah(G),
						p = T[G];
					n[r] ? (n[r](p), "setToolTip" === r && n.enableToolTip && n.enableToolTip()) : n[G] = p
				}
				return n
			},
			setImage: function(W, g, e, G) {
				var J = arguments.length;
				4 === J ? hr(W, G, g, e) : 2 === J ? Ol(g) ? hr(W, g) : us[W] = g : 1 === J && hr(W, W)
			},
			getImage: function(B, j, g) {
				var s;
				if(B == _) return _;
				if(Ki(B) ? s = B : (s = us[B], B && s === S && (eg && eg[B] || hr(B, B))), j && s && s.tagName) {
					var C;
					C = "override" === g ? "colors_override" : "override_rgb" === g ? "colors_override_rgb" : "override_a" === g ? "colors_override_a" : "colors", s[C] || (s[C] = {
						__count__: 0
					});
					var $ = s[C][j];
					return $ || (s[C].__count__ > h.imageCacheThreshold && (s[C] = {
						__count__: 0
					}), $ = Lr(s, Qq(j), s.width, s.height, g), s[C][j] = $, s[C].__count__++), $
				}
				return s
			},
			isImageComplete: function(j, g, H) {
				var W = Ki(j) ? j : us[j];
				if(!W) return !1;
				if(W.tagName) return W.complete;
				for(var i, j, V = W.comps, E = !0, r = 0, Q = V.length; Q > r; r++)
					if(i = V[r], "image" === i.type) {
						j = i.name, j && j.func && (j = Vo(j, g));
						var F = ql(j, g, H);
						if(!F) {
							E = !1;
							break
						}
					}
				return E
			},
			getId: function() {
				var a = 1;
				return function() {
					return ++a
				}
			}(),
			callLater: function(i, G, n, Q) {
				var O = function() {
					i.apply(G, n)
				};
				return Q ? E(O, Q) : Y.requestAnimationFrame(O)
			},
			asyncEach: function(p, G, U) {
				"function" != typeof U && (U = Function.prototype);
				var H = new Array(p.length),
					L = 0,
					z = !1;
				p.forEach(function(h, w) {
					G(h, function(i, N) {
						return z ? void 0 : i ? (z = !0, U(null)) : (H[w] = N, L++, L === p.length ? U(H) : void 0)
					})
				})
			},
			xhrLoad: function(i, J, p) {
				var Y = !1;
				An(i) || (Y = !0, i = [i]), p = p || {}, i.length;
				var N = p.sync,
					M = !!p.post,
					P = p.data || null;
				uo(i, function(n, m) {
					var B = new XMLHttpRequest;
					p.responseType ? B.responseType = p.responseType : B.overrideMimeType && B.overrideMimeType(p.mimeType || "text/plain"), n = h.beforeLoadURL(n), n.data ? m(null, n.data) : (B.open(M ? "POST" : "GET", encodeURI(n), !N), B.onload = function(c) {
						200 === this.status || 0 === this.status ? m(null, c.target.response || c.target.responseText) : m(!0)
					}, B.onerror = function() {
						m(!0)
					}, B.send(P))
				}, function(W) {
					"function" == typeof J && J(Y && W ? W[0] : W)
				})
			},
			clone: function(h) {
				if(null == h || "object" != typeof h) return h;
				if(h instanceof Date) {
					var y = new Date;
					return y.setTime(h.getTime()), y
				}
				if(h instanceof Array) {
					for(var y = [], g = 0, v = h.length; v > g; g++) y[g] = sq(h[g]);
					return y
				}
				if(h instanceof ag) {
					for(var y = new ag, g = 0, v = h.length; v > g; g++) y.set(g, sq(h.get(g)));
					return y
				}
				if(h instanceof No) return h;
				if(h instanceof f) {
					var y = {};
					for(var b in h) h.hasOwnProperty(b) && (y[b] = sq(h[b]));
					return y
				}
				return h
			},
			callWhenLoaded: function(g, S) {
				S = S || 100;
				var i = ao(g, S);
				Sh || (Sh = {}), Sh[i] = {
					tick: i,
					cb: g,
					delay: S
				}
			},
			beforeLoadURL: function(R) {
				if(Sh) {
					var O = {};
					for(var i in Sh) {
						var G = Sh[i];
						u(G.tick);
						var T = ao(G.cb, G.delay);
						O[T] = {
							tick: T,
							delay: G.delay,
							cb: G.cb
						}
					}
					Sh = O
				}
				return h.convertURL ? h.convertURL(R) : R
			},
			convertURL: function(I) {
				return I
			},
			handleRefGraphLoaded: function() {},
			handleCompTypeLoaded: function() {},
			handleImageLoaded: function() {},
			handleUnfoundImage: function() {},
			sortFunc: function(B, m) {
				if(B === m) return 0;
				if(B == _ && m != _) return 1;
				if(B != _ && m == _) return -1;
				if(B == _ && m == _) return 0;
				var O, y = typeof B,
					C = typeof m;
				return y === yr && C === yr ? O = B.localeCompare(m) : y === en && C === en && (O = B - m), O === S && (O = ("" + B).localeCompare("" + m)), O > 0 ? 1 : 0 > O ? -1 : 0
			},
			getClassMap: function() {
				return dk
			},
			getClass: function(s) {
				if(Ol(s)) {
					var N, B = dk[s];
					if(!B) {
						N = s.split("."), B = Y;
						for(var T = 0; T < N.length; T++) B = B[N[T]];
						dk[s] = B
					}
					return B
				}
				return s
			},
			def: function(E, C, d) {
				var v, N, x, K = function() {};
				if(K.prototype = C.prototype, v = new K, Ol(E)) {
					if(dk[E]) throw "'" + E + "' already defined";
					x = ms(E), v.getClassName = function() {
						return E
					}
				} else x = E;
				if(v.constructor = x, v.getClass = function() {
						return x
					}, v.getSuperClass = function() {
						return C
					}, d)
					for(N in d) Eq[N] && Eq.hasOwnProperty(N) ? Eq[N](v, d) : qk(v, d, N);
				x.prototype = v, x.superClass = C.prototype
			},
			startAnim: function() {
				var q = function(T) {
					T.duration && (T.startTime = Bk()), T.timeId = Ec(T.tick, _, _, T.interval)
				};
				return function(s) {
					return s = sq(s), s.easing = s.easing || h.animEasing, s.duration || s.frames || (s.duration = h.animDuration), s.t = 0, s.duration ? s.interval = 0 : (s.frame = 0, s.interval = s.interval || 10), s.tick = function() {
						if(s.duration) {
							var Q = (Bk() - s.startTime) / s.duration;
							Q > 1 && (Q = 1), s.t = Q, s.action(s.easing(Q), Q), 1 === Q ? s.stop() : s._isPaused || (s.timeId = Ec(s.tick))
						} else s.frame++, Q = s.t = s.frame / s.frames, s.action(s.easing(Q), Q), s.frame < s.frames ? s._isPaused || (s.timeId = Ec(s.tick, _, _, s.interval)) : s.stop()
					}, s.resume = function() {
						s._isPaused && (delete s._isPaused, s.duration ? s.t < 1 && (s.startTime = Bk() - s.duration * s.t, s.timeId = Ec(s.tick)) : s.frame < s.frames && (s.timeId = Ec(s.tick, _, _, s.interval)))
					}, s.pause = function() {
						s._isPaused = !0
					}, s.stop = function(E) {
						s.isRunning() && (s.duration ? s.t < 1 && E && (s.t = 1, s.action(s.easing(1))) : s.frame < s.frames && E && (s.frame = s.frames, s.action(s.easing(1))), s._37o && s._37o(), s.finishFunc && s.finishFunc(), Oi(s.timeId, !s.duration), delete s.timeId)
					}, s.isRunning = function() {
						return s.timeId != _
					}, s.delay ? Ec(q, _, [s], s.delay) : q(s), s
				}
			}(),
			getTextSize: function() {
				var W = {},
					x = r ? Qc().getContext("2d") : _;
				return function(Z, $) {
					x.font = Z ? Z : sf;
					var P = W[x.font];
					return P || (P = 2 * x.measureText("e").width + 4, W[x.font] = P), {
						width: x.measureText($).width + 4,
						height: P
					}
				}
			}(),
			drawText: function(X, v, q, j, r, W, E, S, F, C) {
				if(v != _) {
					var b = Re(q, v),
						I = {};
					I.y = C && C !== On ? C === Pi ? W + b.height / 2 : W + S - b.height / 2 : W + S / 2, I.x = F && F !== vr ? F === Td ? r + E - b.width / 2 : r + E / 2 : r + b.width / 2, qd(X, v, I, q, j)
				}
			},
			getDistance: function(L, p) {
				var D = L.length;
				return p ? 3 === D ? n(B(L[0] - p[0]) + B(L[1] - p[1]) + B(L[2] - p[2])) : 2 === D ? n(B(L[0] - p[0]) + B(L[1] - p[1])) : L.z === S ? n(B(p.x - L.x) + B(p.y - L.y)) : n(B(p.x - L.x) + B(p.y - L.y) + B(p.z - L.z)) : 3 === D ? n(B(L[0]) + B(L[1]) + B(L[2])) : 2 === D ? n(B(L[0]) + B(L[1])) : void 0
			},
			brighter: function(i, B) {
				return 0 > B && (B = -B), ak(i, B ? B : 40)
			},
			darker: function(H, i) {
				return i > 0 && (i = -i), ak(H, i ? i : -40)
			},
			unionPoint: function(L, T) {
				if(!L) return _;
				if(2 === arguments.length) return L && T ? {
					x: R(L.x, T.x),
					y: R(L.y, T.y),
					width: d(L.x - T.x),
					height: d(L.y - T.y)
				} : _;
				var p = L;
				if(p._as && (p = p._as), p.length === S) return _;
				var W = p.length;
				if(0 >= W) return _;
				for(var E = 1, e = p[0], F = {
						x: e.x,
						y: e.y,
						width: 0,
						height: 0
					}; W > E; E++) {
					e = p[E];
					var C = R(F.x, e.x),
						Q = N(F.x + F.width, e.x),
						r = R(F.y, e.y),
						J = N(F.y + F.height, e.y);
					F.x = C, F.y = r, F.width = Q - C, F.height = J - r
				}
				return F
			},
			unionRect: function(Y, m) {
				if(Y && !m) return sq(Y);
				if(!Y && m) return sq(m);
				if(Y && m) {
					var d = {
						x: R(Y.x, m.x),
						y: R(Y.y, m.y)
					};
					return d.width = N(Y.x + Y.width, m.x + m.width) - d.x, d.height = N(Y.y + Y.height, m.y + m.height) - d.y, d
				}
				return _
			},
			containsPoint: function(u, W, m, k) {
				if(k != _ && 1 !== k) {
					var I = u.x + u.width / 2,
						z = u.y + u.height / 2;
					u = {
						x: I - u.width / 2 * k,
						y: z - u.height / 2 * k,
						width: u.width * k,
						height: u.height * k
					}
				}
				if(m) {
					var q = u.width / 2,
						e = u.height / 2,
						T = L(-m),
						Y = s(-m),
						c = W.x - u.x - q,
						N = W.y - u.y - e;
					return W = {
						x: Y * c - T * N,
						y: T * c + Y * N
					}, Qf({
						x: -q,
						y: -e,
						width: u.width,
						height: u.height
					}, W)
				}
				return !(!u || W.x < u.x || W.y < u.y || W.x > u.x + u.width || W.y > u.y + u.height)
			},
			containsRect: function(G, q) {
				if(!G || !q) return !1;
				var D = q.x,
					b = q.y,
					j = q.width,
					p = q.height,
					n = G.width,
					J = G.height;
				if(0 > (n | J | j | p)) return !1;
				var e = G.x,
					h = G.y;
				if(e > D || h > b) return !1;
				if(n += e, j += D, D >= j) {
					if(n >= e || j > n) return !1
				} else if(n >= e && j > n) return !1;
				if(J += h, p += b, b >= p) {
					if(J >= h || p > J) return !1
				} else if(J >= h && p > J) return !1;
				return !0
			},
			intersectsRect: function(A, P) {
				if(!A || !P) return !1;
				var I = P.width,
					v = P.height,
					k = A.width,
					Q = A.height;
				if(0 >= k || 0 >= Q || 0 >= I || 0 >= v) return !1;
				var B = P.x,
					c = P.y,
					J = A.x,
					r = A.y;
				return k += J, Q += r, I += B, v += c, k > B && Q > c && I > J && v > r
			},
			intersection: function(l, T) {
				if(!l || !T) return _;
				var a = T.x,
					N = T.y,
					J = l.x,
					F = l.y,
					H = a,
					k = N,
					y = J,
					O = F;
				return H += T.width, k += T.height, y += l.width, O += l.height, J > a && (a = J), F > N && (N = F), H > y && (H = y), k > O && (k = O), H -= a, k -= N, 0 >= H || 0 >= k ? _ : {
					x: a,
					y: N,
					width: H,
					height: k
				}
			},
			grow: function(P, o, j) {
				j === S && (j = o), P.x -= o, P.y -= j, P.width = P.width + 2 * o, P.height = P.height + 2 * j
			},
			getLogicalPoint: function(a, $, H, s, U, Q) {
				Sj(a) ? I ? oi["91"] = !0 : oi["17"] = !0 : I ? oi["91"] = !1 : oi["17"] = !1, oi["16"] = Tm(a) ? !0 : !1;
				var z = $.getBoundingClientRect();
				return a = k ? Im(a) : a, {
					x: (a.clientX - z.left + $.scrollLeft - (H || 0)) / (U || 1),
					y: (a.clientY - z.top + $.scrollTop - (s || 0)) / (Q || 1)
				}
			},
			removeHTML: function() {
				var u;
				return function(g) {
					return g && g.parentNode ? u === g ? !0 : (u = g, g.parentNode.removeChild(g), u = _, !0) : !1
				}
			}(),
			getToolTipDiv: function() {
				if(!Ch) {
					Ch = ff(), pe = ff();
					var k = Ch.style;
					h.baseZIndex != _ && (k.zIndex = b(h.baseZIndex) + 3 + ""), k.whiteSpace = "nowrap", k.color = h.toolTipLabelColor, k.background = h.toolTipBackground, k.font = h.toolTipLabelFont, k.padding = "5px", k.boxShadow = "0px 0px 3px " + h.toolTipShadowColor
				}
				return Ch
			},
			isToolTipShowing: function() {
				return Ch && Ch.parentNode ? !0 : pe && pe.parentNode ? !0 : !1
			},
			hideToolTip: function() {
				Cj(Ch), Cj(pe), Sc()
			},
			showToolTip: function(y, F) {
				if(!y || F == _) return Jh(), void 0;
				h.getToolTipDiv();
				var l, v;
				if(F.html ? (F = F.html, l = pe, Cj(Ch)) : (l = Ch, Cj(pe)), v = l.style, l.innerHTML = F, l.parentNode || z.Default.appendToScreen(l), y.target) {
					y = _b(y);
					var Z = Ae(),
						n = y.x,
						X = y.y,
						o = k ? 60 : 12;
					if(k) {
						var A = l.getBoundingClientRect();
						v.left = n - A.width / 2 + hh, v.top = X - A.height - o < Z.top ? X + o + hh : X - A.height - o + hh
					} else {
						v.left = n + o + hh, v.top = X + o + hh;
						var A = l.getBoundingClientRect();
						A.left + A.width > Z.width && (v.left = n - o - A.width + hh), A.top + A.height > Z.height && (v.top = X - o - A.height + hh), A.left < 0 && (v.left = n + o + hh), A.top < 0 && (v.top = X + o + hh)
					}
				} else v.left = y.x + hh, v.top = y.y + hh;
				Sc()
			},
			startDragging: function(S, s) {
				S !== zg && (zg ? k ? zg.handleWindowTouchEnd(s) : zg.handleWindowMouseUp(s) : k ? (Y.addEventListener(bq, Yc, !1), Y.addEventListener(Bb, vq, !1)) : (Y.addEventListener(dp, Pq, !1), Y.addEventListener(Cd, Uf, !1)), zg = S)
			},
			getImageMap: function() {
				return us
			},
			toBoundaries: function(S, h, R, m) {
				var j = [];
				return Lh(S, h, R, m).forEach(function(X) {
					var L = [];
					X.forEach(function(D) {
						L.push(D.x, D.y)
					}), j.push(L)
				}), j
			},
			getCurrentKeyCodeMap: function() {
				return oi
			},
			drawCenterImage: function(n, v, c, e, T, A, b, Z) {
				var o = ui(v, T, A),
					F = Hk(v, T, A);
				wd(n, v, g(c - o / 2), g(e - F / 2), o, F, T, A, b, Z)
			},
			drawStretchImage: function(L, Y, P, N, B, I, e, T, j, t, J, d) {
				var i, H = ui(Y, T, j, I),
					V = Hk(Y, T, j, e);
				if("uniform" === P ? (i = R(I / H, e / V), H *= i, V *= i, N += g((I - H) / 2), B += g((e - V) / 2), I = H, e = V) : "centerUniform" === P && ((H > I || V > e) && (i = R(I / H, e / V), H *= i, V *= i), N += g((I - H) / 2), B += g((e - V) / 2), I = H, e = V), "center" === P) {
					var G = J !== !1 && (H > I || V > e);
					G && (L.save(), L.beginPath(), L.rect(N, B, I, e), L.clip()), wd(L, Y, N + I / 2 - H / 2, B + e / 2 - V / 2, H, V, T, j, t, d), G && L.restore()
				} else wd(L, Y, N, B, I, e, T, j, t, d)
			},
			toCanvas: function(p, P, E, H, K, o, R, y, v) {
				p = Ui(p, R), P = P || ui(p, K), E = E || Hk(p, K);
				var q = Qc(),
					D = wc(q);
				return y ? (Mj(q, P, E, y), D.scale(y, y)) : Mj(q, P, E, 1), yq(D, p, H, 0, 0, P, E, K, o, R, v), p && p.clampToEdge && (q.clampToEdge = p.clampToEdge), D.restore(), q
			},
			createGradientImage: function(p, F, l, m) {
				for(var C = ["L", 0, 0, p, 0, 1, 0, 0, 1, 0, 0], f = 0, $ = Math.min(F.length, l.length); $ > f; f++) C.push(l[f], F[f]);
				var c = z.Default.toCanvas({
					width: p,
					height: p,
					clampToEdge: !0,
					comps: [{
						type: "shape",
						rotation: m || 0,
						points: [0, 0, p, 0, p, p, 0, p],
						background: "#ffffff",
						gradientPack: C
					}]
				});
				return c
			},
			createElement: function(I, b, B, m) {
				var W = r.createElement(I);
				return Ur(W, b || p.widgetBorder, 2), W.style.font = B ? B : sf, m != _ && (W.value = m), h.onElementCreated && h.onElementCreated(W), W
			},
			containedInView: function(o, K) {
				var p = Pp(K).getBoundingClientRect();
				return Qf({
					x: p.left,
					y: p.top,
					width: p.width,
					height: p.height
				}, Br(o))
			},
			isIsolating: function() {
				return he
			},
			setIsolating: function(n) {
				he = n
			},
			getMSMap: function() {
				return Eq
			},
			stringify: function(e, o) {
				var v = Date.prototype.toJSON;
				Date.prototype.toJSON = function() {
					return "__ht__date" + this.getTime()
				};
				var j = JSON.stringify(e, function(i, E) {
					return "function" == typeof E ? "__ht__" + (E.__ht__ || E.toString()) : jb(E) ? Ne(E) : E
				}, o == _ ? 2 : o);
				return Date.prototype.toJSON = v, j
			},
			parse: function(T) {
				return Ol(T) ? JSON.parse(T, function(Q, J) {
					if(Ol(J)) {
						if("__ht__function" == J.substr(0, 14)) {
							var P = J.indexOf("{") + 1,
								N = J.lastIndexOf("}"),
								u = J.indexOf("(") + 1,
								d = J.indexOf(")");
							if(P && N && u && d) {
								var W = new Function(J.substring(u, d), J.substring(P, N));
								return W.__ht__ = J.substr(6), W
							}
						}
						if("__ht__date" == J.substr(0, 10)) return new Date(b(J.substr(10)))
					}
					return J
				}) : T
			},
			loadJS: function(z, c) {
				c && z.push(c);
				var B = z.shift();
				if(An(B)) z = B.contact(z), h.loadJS(z);
				else if(jc(B)) B(), h.loadJS(z);
				else if(Ol(B)) {
					var C = r.createElement("script");
					C.onload = function() {
						h.loadJS(z)
					}, C.setAttribute("src", B), r.getElementsByTagName("head")[0].appendChild(C)
				} else z.length && h.loadJS(z)
			},
			toRoundedCorner: function(F, M) {
				var q = F.size();
				if(0 >= M) return {
					points: F
				};
				var h, T = new ag,
					J = new ag,
					o = F.get(0);
				T.add(o), J.add(1);
				for(var f = 1; q > f; f++)
					if(q > f + 1) {
						var g = F.get(f),
							e = F.get(f + 1),
							n = o.x,
							v = o.y,
							j = g.x,
							u = g.y,
							i = u - v,
							z = j - n,
							E = c(i, z);
						h = R(.99 * uh(o, g), M), T.add({
							x: j - h * s(E),
							y: u - h * L(E)
						}), T.add(g), n = g.x, v = g.y, j = e.x, u = e.y, i = u - v, z = j - n, E = c(i, z), h = R(.99 * uh(g, e), M), o = {
							x: n + h * s(E),
							y: v + h * L(E)
						}, T.add(o), J.addAll([2, 3])
					} else T.add(F.get(f)), J.add(2);
				return {
					points: T,
					segments: J
				}
			},
			toColorData: Hl,
			setCanvas: Mj,
			createDiv: ff,
			createDisabledDiv: gd,
			createView: Co,
			createCanvas: Qc,
			appendChild: Yb,
			initContext: wc,
			checkLoadingImage: xi,
			translateAndScale: bi,
			layout: Pm,
			getPosition: Uc,
			drawPoints: Vb,
			drawRoundRect: Zd,
			drawBorder: so,
			setFocus: Hm,
			getter: Ik,
			setter: Ah,
			isEmptyObject: Bh
		}, !0), yi(a, {
			autoAdjustIndex: 1,
			hierarchicalRendering: 1,
			adjustChildrenToTop: 1,
			autoHideScrollBar: 1,
			autoUpdate: 1,
			firstPersonMode: 1,
			ortho: 1,
			strict: 1,
			stickToRight: 1,
			instant: 1,
			closePath: 1,
			hierarchical: 1,
			doubleClickToToggle: 1,
			continuousLayout: 1,
			syncSize: 1
		}, !0);
		var ck = h.disabledOpacity,
			Ke = h.toolTipDelay,
			dg = h.devicePixelRatio,
			zs = h.autoMakeVisible,
			Vp = h.autoHideScrollBar,
			Xn = h.imageGradient,
			Fh = h.showToolTip,
			Jh = h.hideToolTip,
			cs = h.dashPattern,
			sg = h.lineCap,
			xj = h.lineJoin,
			jr = h.labelColor,
			rf = h.labelSelectColor,
			sf = h.labelFont,
			ab = h.widgetIndent,
			Hr = h.widgetRowHeight,
			mg = h.widgetHeaderHeight,
			vf = h.widgetTitleHeight,
			Bq = h.scrollBarColor,
			sr = h.scrollBarSize,
			wq = h.scrollBarTimeout,
			ee = h.scrollBarMinLength,
			jq = h.scrollBarInteractiveSize,
			Tn = h.zoomIncrement,
			Ll = h.scrollZoomIncrement,
			bs = h.pinchZoomIncrement,
			al = h.zoomMax,
			Yp = h.zoomMin,
			Bo = h.createObject,
			Aj = h.preventDefault,
			Wi = h.setImage,
			Ui = h.getImage,
			ql = h.isImageComplete,
			Ip = h.drawCenterImage,
			yq = h.drawStretchImage,
			zm = h.getId,
			Ec = h.callLater,
			uo = h.asyncEach,
			nh = (h.xhrLoad, h.sortFunc),
			sq = h.clone,
			ms = h.getClass,
			Ai = h.startAnim,
			Ml = h.brighter,
			Ph = h.darker,
			ul = h.drawText,
			Re = h.getTextSize,
			Ln = h.isLeftButton,
			_g = h.getTouchCount,
			Jm = h.isDoubleClick,
			Tm = h.isShiftDown,
			Sj = h.isCtrlDown,
			Br = h.getClientPoint,
			_b = h.getPagePoint,
			uh = h.getDistance,
			kl = h.unionPoint,
			Xl = h.unionRect,
			Qf = h.containsPoint,
			tn = h.containsRect,
			mh = h.intersectsRect,
			ns = h.intersection,
			Ae = h.getWindowInfo,
			jk = h.grow,
			qg = h.getLogicalPoint,
			ti = h.startDragging,
			Cj = h.removeHTML,
			Oh = h.createElement,
			ar = h.segmentResolution,
			Sr = h.shapeResolution,
			Jo = h.shapeSide,
			xh = h.def,
			Bm = function(g, I, Q) {
				xh(m + "." + g, I, Q)
			},
			pp = function(U, z) {
				U.childNodes.forEach(function(Y) {
					z(Y), pp(Y, z)
				})
			};
		yi(h, {
			toolTipLabelColor: jr,
			toolTipLabelFont: sf,
			toolTipBackground: p.toolTipBackground,
			toolTipShadowColor: yn,
			drawBreakableText: ho,
			setDevicePixelRatio: function(H) {
				dg = h.devicePixelRatio = "number" == typeof H ? H : Y.devicePixelRatio, pp(r.body, function(l) {
					var Y = l._ht;
					Y && Y._canvas && (Mj(Y._canvas, Y.getWidth(), Y.getHeight()), Y.redraw ? Y.redraw() : Y.iv())
				})
			}
		}, !0);
		var Rc = 1e-6,
			Fd = "undefined" != typeof Uint16Array ? Uint16Array : Array,
			Km = "undefined" != typeof Float32Array ? Float32Array : Array,
			Jn = function(X, P, s) {
				var n = [X[0] - P[0], X[1] - P[1], X[2] - P[2]];
				if(s) {
					var v = uh(n);
					v > 0 && (n[0] /= v, n[1] /= v, n[2] /= v)
				}
				return n
			},
			to = function(P) {
				return [-P[0], -P[1], -P[2]]
			},
			Yg = function(S, v) {
				return 3 === S.length ? S[0] * v[0] + S[1] * v[1] + S[2] * v[2] : S[0] * v[0] + S[1] * v[1]
			},
			Wh = function() {
				var X = new Km(16);
				return X[0] = 1, X[1] = 0, X[2] = 0, X[3] = 0, X[4] = 0, X[5] = 1, X[6] = 0, X[7] = 0, X[8] = 0, X[9] = 0, X[10] = 1, X[11] = 0, X[12] = 0, X[13] = 0, X[14] = 0, X[15] = 1, X
			},
			Pd = Wh(),
			Nh = function(T) {
				var S = new Km(16);
				return S[0] = T[0], S[1] = T[1], S[2] = T[2], S[3] = T[3], S[4] = T[4], S[5] = T[5], S[6] = T[6], S[7] = T[7], S[8] = T[8], S[9] = T[9], S[10] = T[10], S[11] = T[11], S[12] = T[12], S[13] = T[13], S[14] = T[14], S[15] = T[15], S
			},
			Gm = function(N, A) {
				return N[0] = A[0], N[1] = A[1], N[2] = A[2], N[3] = A[3], N[4] = A[4], N[5] = A[5], N[6] = A[6], N[7] = A[7], N[8] = A[8], N[9] = A[9], N[10] = A[10], N[11] = A[11], N[12] = A[12], N[13] = A[13], N[14] = A[14], N[15] = A[15], N
			},
			Cm = function(v) {
				return v[0] = 1, v[1] = 0, v[2] = 0, v[3] = 0, v[4] = 0, v[5] = 1, v[6] = 0, v[7] = 0, v[8] = 0, v[9] = 0, v[10] = 1, v[11] = 0, v[12] = 0, v[13] = 0, v[14] = 0, v[15] = 1, v
			},
			ph = function(O, Z) {
				var $ = O[0],
					C = O[1],
					l = O[2];
				return O[0] = Z[0] * $ + Z[4] * C + Z[8] * l + Z[12], O[1] = Z[1] * $ + Z[5] * C + Z[9] * l + Z[13], O[2] = Z[2] * $ + Z[6] * C + Z[10] * l + Z[14], O
			},
			Mn = function(B, D) {
				var Z = B[0],
					X = B[1],
					l = B[2],
					A = B[3];
				return B[0] = D[0] * Z + D[4] * X + D[8] * l + D[12] * A, B[1] = D[1] * Z + D[5] * X + D[9] * l + D[13] * A, B[2] = D[2] * Z + D[6] * X + D[10] * l + D[14] * A, B[3] = D[3] * Z + D[7] * X + D[11] * l + D[15] * A, B
			},
			oh = function() {
				var _, C, e, g, Q = Fr(_m[1] + _m[7]),
					J = Fr(_m[0] + _m[3] - _m[10]),
					q = Fr(_m[8] + 2),
					U = function() {
						return C = e.charAt(_), _ += 1, C
					},
					r = function() {
						var N = "";
						if(C === q)
							for(; U();) {
								if(C === q) return U(), N;
								N += C
							} else U()
					},
					K = function() {
						for(; C && " " >= C;) U()
					},
					c = function() {
						var F, $ = {};
						if(C === Q) {
							if(U(), K(), C === J) return U(), $;
							for(; C;) {
								if(F = r(), K(), U(), $[F] = g(), K(), C === J) return U(), $;
								U(), K()
							}
						}
					};
				return g = function() {
						switch(K(), C) {
							case Q:
								return c();
							default:
								return r()
						}
					},
					function(n) {
						if(i = {}, n) {
							var L;
							if(e = n, _ = 0, C = " ", L = g(), K(), !C) return L
						}
					}
			}(),
			Yk = function(K, G) {
				if(G) {
					var F = L(G),
						q = s(G),
						E = K[4],
						w = K[5],
						Z = K[6],
						l = K[7],
						_ = K[8],
						N = K[9],
						t = K[10],
						R = K[11];
					K[4] = E * q + _ * F, K[5] = w * q + N * F, K[6] = Z * q + t * F, K[7] = l * q + R * F, K[8] = _ * q - E * F, K[9] = N * q - w * F, K[10] = t * q - Z * F, K[11] = R * q - l * F
				}
			},
			Rr = function(x, C) {
				if(C) {
					var w = L(C),
						o = s(C),
						O = x[0],
						S = x[1],
						d = x[2],
						T = x[3],
						M = x[8],
						Y = x[9],
						$ = x[10],
						t = x[11];
					x[0] = O * o - M * w, x[1] = S * o - Y * w, x[2] = d * o - $ * w, x[3] = T * o - t * w, x[8] = O * w + M * o, x[9] = S * w + Y * o, x[10] = d * w + $ * o, x[11] = T * w + t * o
				}
			},
			oe = function(e, I) {
				if(I) {
					var W = L(I),
						X = s(I),
						c = e[0],
						P = e[1],
						Y = e[2],
						v = e[3],
						T = e[4],
						D = e[5],
						A = e[6],
						l = e[7];
					e[0] = c * X + T * W, e[1] = P * X + D * W, e[2] = Y * X + A * W, e[3] = v * X + l * W, e[4] = T * X - c * W, e[5] = D * X - P * W, e[6] = A * X - Y * W, e[7] = l * X - v * W
				}
			},
			el = function(r, l, Y) {
				return Uj(_, Y === !1 ? _ : r.getFinalScale3d(), r.r3(), r.getRotationMode(), r.p3(), _, l)
			},
			Uj = function(_, k, i, C, Q, Y, o) {
				return Y || (Y = Wh()), Q && lg(Y, Q), Dl(Y, i, C), o && Zl(Y, Y, o), k && Tc(Y, k), _ && Zl(Y, Y, _), Y
			},
			vn = function(t, $, H) {
				$ = b($), H = b(H);
				var p = this;
				p.g = t, p._84O = $, p._85O = H, p._70I = !0, p.F = 0, p._83O = $ + H, p.pen = {
					x: 0,
					y: 0
				}
			},
			Fb = "lineDashOffset",
			Wb = "setLineDash",
			Ng = function(n) {
				for(var Z in n) 1 === Z.length && (Fb = n[Z]);
				return Z ? 1 : 0
			},
			In = function(_, Z, x) {
				return Zk(Z) ? _ : _[Wb] ? (_[Wb](Z), x && (_.lineDashOffset = x), _) : new vn(_, Z[0], Z.length > 1 ? Z[1] : Z[0])
			},
			Rj = function(C, N) {
				!Zk(N) && C[Wb] && (C[Wb](Cf), C.lineDashOffset = 0)
			};
		if(xh(vn, f, {
				_69I: 6,
				moveTo: function(S, J) {
					var Z = this,
						W = Z.pen;
					W.x = S, W.y = J, Z.g.moveTo(S, J), Z.start || (Z.start = {
						x: S,
						y: J
					})
				},
				lineTo: function(N, J) {
					var m = this,
						H = m.pen,
						l = N - H.x,
						V = J - H.y,
						a = c(V, l),
						x = s(a),
						Z = L(a),
						U = m._23O(H.x, H.y, N, J),
						y = m._85O,
						h = m._84O,
						Y = m._83O;
					if(m.F) {
						if(m.F > U) return m._70I ? m._72I(N, J) : m.moveTo(N, J), m.F -= U, void 0;
						if(m._70I ? m._72I(H.x + x * m.F, H.y + Z * m.F) : m.moveTo(H.x + x * m.F, H.y + Z * m.F), U -= m.F, m.F = 0, m._70I = !m._70I, !U) return
					}
					var k = X(U / Y);
					if(k) {
						for(var $ = x * h, u = Z * h, T = x * y, A = Z * y, F = 0; k > F; F++) m._70I ? (m._72I(H.x + $, H.y + u), m.moveTo(H.x + T, H.y + A)) : (m.moveTo(H.x + T, H.y + A), m._72I(H.x + $, H.y + u));
						U -= Y * k
					}
					m._70I ? U > h ? (m._72I(H.x + x * h, H.y + Z * h), m.moveTo(N, J), m.F = y - (U - h), m._70I = !1) : (m._72I(N, J), U === h ? (m.F = 0, m._70I = !m._70I) : (m.F = h - U, m.moveTo(N, J))) : U > y ? (m.moveTo(H.x + x * y, H.y + Z * y), m._72I(N, J), m.F = h - (U - y), m._70I = !0) : (m.moveTo(N, J), U === y ? (m.F = 0, m._70I = !m._70I) : m.F = y - U)
				},
				quadraticCurveTo: function(Q, w, J, A) {
					var K, i = this,
						P = i.pen,
						M = P.x,
						m = P.y,
						t = i._22O(M, m, Q, w, J, A),
						$ = 0,
						n = 0,
						O = i._85O,
						H = i._84O;
					if(i.F) {
						if(i.F > t) return i._70I ? i._71I(Q, w, J, A) : i.moveTo(J, A), i.F -= t, void 0;
						if($ = i.F / t, K = i._20O(M, m, Q, w, J, A, $), i._70I ? i._71I(K[2], K[3], K[4], K[5]) : i.moveTo(K[4], K[5]), i.F = 0, i._70I = !i._70I, !t) return
					}
					var T = t - t * $,
						y = X(T / i._83O),
						q = H / t,
						u = O / t;
					if(y)
						for(var l = 0; y > l; l++) i._70I ? (n = $ + q, K = i._21O(M, m, Q, w, J, A, $, n), i._71I(K[2], K[3], K[4], K[5]), $ = n, n = $ + u, K = i._21O(M, m, Q, w, J, A, $, n), i.moveTo(K[4], K[5])) : (n = $ + u, K = i._21O(M, m, Q, w, J, A, $, n), i.moveTo(K[4], K[5]), $ = n, n = $ + q, K = i._21O(M, m, Q, w, J, A, $, n), i._71I(K[2], K[3], K[4], K[5])), $ = n;
					T = t - t * $, i._70I ? T > H ? (n = $ + q, K = i._21O(M, m, Q, w, J, A, $, n), i._71I(K[2], K[3], K[4], K[5]), i.moveTo(J, A), i.F = O - (T - H), i._70I = !1) : (K = i._19O(M, m, Q, w, J, A, $), i._71I(K[2], K[3], K[4], K[5]), t === H ? (i.F = 0, i._70I = !i._70I) : (i.F = H - T, i.moveTo(J, A))) : T > O ? (n = $ + u, K = i._21O(M, m, Q, w, J, A, $, n), i.moveTo(K[4], K[5]), K = i._19O(M, m, Q, w, J, A, n), i._71I(K[2], K[3], K[4], K[5]), i.F = H - (T - O), i._70I = !0) : (i.moveTo(J, A), T === O ? (i.F = 0, i._70I = !i._70I) : i.F = O - T)
				},
				bezierCurveTo: function() {
					var v = arguments;
					this.pen = {
						x: v[4],
						y: v[5]
					}, this.g.bezierCurveTo(v[0], v[1], v[2], v[3], v[4], v[5])
				},
				arc: function(g, C, u, X, D, s) {
					s || (X = -X, D = -D), Gd(this, g, C, X, D - X, u, u, !1)
				},
				rect: function(X, v, u, O) {
					var b = this;
					b.pen = {
						x: X,
						y: v
					}, b.moveTo(X, v), b.lineTo(X, v + O), b.lineTo(X + u, v + O), b.lineTo(X + u, v), b.lineTo(X, v)
				},
				beginPath: function() {
					this.g.beginPath()
				},
				closePath: function() {
					this.lineTo(this.start.x, this.start.y)
				},
				_23O: function(J, L, N, i) {
					var _ = N - J,
						W = i - L;
					return n(_ * _ + W * W)
				},
				_22O: function(b, H, B, q, g, R, s) {
					for(var X, v, T, p, z, A, G, u = 0, K = b, k = H, l = s > 0 ? s : this._69I, J = 1; l >= J; J++) T = J / l, p = 1 - T, z = p * p, A = 2 * T * p, G = T * T, X = z * b + A * B + G * g, v = z * H + A * q + G * R, u += this._23O(K, k, X, v), K = X, k = v;
					return u
				},
				_21O: function(m, c, M, i, p, K, N, y) {
					var t = this;
					if(0 === N) return t._20O(m, c, M, i, p, K, y);
					if(1 === y) return t._19O(m, c, M, i, p, K, N);
					var $ = t._20O(m, c, M, i, p, K, y);
					return $.push(N / y), t._19O.apply(t, $)
				},
				_20O: function(c, r, f, x, U, I, d) {
					if(1 !== d) {
						var v = f + (U - f) * d,
							j = x + (I - x) * d;
						f = c + (f - c) * d, x = r + (x - r) * d, U = f + (v - f) * d, I = x + (j - x) * d
					}
					return [c, r, f, x, U, I]
				},
				_19O: function(n, f, V, s, Y, g, p) {
					if(1 !== p) {
						var D = n + (V - n) * p,
							l = f + (s - f) * p;
						V += (Y - V) * p, s += (g - s) * p, n = D + (V - D) * p, f = l + (s - l) * p
					}
					return [n, f, V, s, Y, g]
				},
				_72I: function(V, Z) {
					var y = this.pen;
					(V !== y.x || Z !== y.y) && (y.x = V, y.y = Z, this.g.lineTo(V, Z))
				},
				_71I: function(z, D, m, N) {
					var Z = this.pen;
					(z !== m || D !== N || m !== Z.x || N !== Z.y) && (Z.x = m, Z.y = N, this.g.quadraticCurveTo(z, D, m, N))
				}
			}), e && U) {
			var mk = U.toString();
			w = mk.indexOf(Ji.substr(0, 2)) > 0 && mk.indexOf(Pi + Pi.substr(1, 1)) > 1 ? !0 : !1
		}
		var Mi = _,
			Xr = _,
			jn = function(n) {
				Mi && !n._72O && (Xr || (Xr = {}), Xr[n._72O = zm()] = n)
			},
			Mk = function(T, l) {
				if(l || (l = T), l && (Mi || (Mi = {}), !Mi[T])) {
					var O = new XMLHttpRequest;
					if(Mi[l] = {
							request: O,
							url: l
						}, O.overrideMimeType && O.overrideMimeType("text/plain"), l = h.beforeLoadURL(l), l.data) {
						var J = h.parse(l.data);
						hb(T, J), h.handleCompTypeLoaded(T, J)
					} else O.open("GET", encodeURI(l), !0), O.onload = function(E) {
						if(200 === this.status || 0 === this.status) {
							var f = h.parse(E.target.response || E.target.responseText);
							hb(T, f), h.handleCompTypeLoaded(T, f)
						} else hb(T, _)
					}, O.onerror = function() {
						hb(T, _)
					}, O.send(null)
				}
			},
			hb = function(V, j) {
				if(dm[V] = j, delete Mi[V], Bh(Mi) && (Mi = _, Xr)) {
					for(var D in Xr) {
						var b = Xr[D];
						b.invalidateAll && b.invalidateAll(S, "compTypeLoaded", V), b.redraw && b.redraw(), b.iv(), delete b._72O
					}
					Xr = _
				}
				if(j && Xr)
					for(var D in Xr) {
						var b = Xr[D];
						b.invalidateAll && b.invalidateAll(S, "compTypeLoading", V), b.redraw && b.redraw(), b.iv()
					}
			},
			de = p.chart,
			Df = h.compStack = [],
			Yj = /^style@/,
			um = /^attr@/,
			Yf = /^field@/,
			Xe = {
				x: .5,
				y: .5
			},
			ui = function(d, $, G, Q) {
				if(!d) return 0;
				if(Vo(d.fitSize, $, G) && Q) return Q;
				var e = Vo(d.width, $, G);
				return null == e ? 20 : e
			},
			Hk = function(j, p, T, o) {
				if(!j) return 0;
				if(Vo(j.fitSize, p, T) && o) return o;
				var $ = Vo(j.height, p, T);
				return null == $ ? 20 : $
			},
			Vo = function(s, c, Z) {
				if(!s || !s.func) return s;
				var j, H = s.func,
					K = s.value;
				return j = jc(H) ? Z && Z.vectorDataBindingDisabled && !s.isSafeFunc ? K : H(c, Z) : c instanceof No ? um.test(H) ? c.a(H.slice(5)) : Yj.test(H) ? c.s(H.slice(6)) : Yf.test(H) ? c[H.slice(6)] : c[H] ? c[H](Z) : K : K, K !== S && j == _ ? K : j
			},
			wd = h.drawImage = function() {
				var v, $, Y, T, u, e, w = function(Z, $) {
						Z.getValue && Z.getValue.compType === $ || (Z.getValue = function(I) {
							var g = l(Z, I);
							if(g === S && $.properties) {
								var c = $.properties[I];
								c && (g = c.defaultValue)
							}
							return g
						}, Z.getValue.compType = $)
					},
					l = function(U, X, i) {
						var p = U[X];
						return p && p.func ? (p = Vo(p, $, Y), i && (p = i(p))) : i && (p = U[X] = i(p)), p
					},
					D = function(V, Y) {
						var C;
						if(C = Y ? l(V, Y) : V, u && C) {
							if("override" === e) return u;
							if("override_rgb" === e) {
								var A = Qq(u);
								return C = Hl(C), "rgba(" + X(255 * A[0]) + "," + X(255 * A[1]) + "," + X(255 * A[2]) + "," + C[3] / 255 + ")"
							}
							if("override_a" === e) {
								var A = Qq(u);
								return C = Hl(C), "rgba(" + C[0] + "," + C[1] + "," + C[2] + "," + A[3] + ")"
							}
							var A = Qq(u);
							return C = Hl(C), "rgba(" + X(C[0] * A[0]) + "," + X(C[1] * A[1]) + "," + X(C[2] * A[2]) + "," + C[3] / 255 * A[3] + ")"
						}
						return C
					},
					r = function(y) {
						if(An(y)) {
							for(var d = new ag, J = y.length, f = 0; J > f; f += 2) d.add({
								x: y[f],
								y: y[f + 1]
							});
							y = d
						}
						return y
					},
					C = function(q) {
						var k = l(q, "anchorX"),
							G = l(q, "anchorY");
						if(k !== S || G !== S) return {
							x: k === S ? Xe.x : k,
							y: G === S ? Xe.y : G
						};
						var v = l(q, "type"),
							Q = l(q, "name");
						if("image" !== v || !Q) return Xe;
						var R = Ui(Q);
						return R && R.anchorX && R.anchorY ? {
							x: R.anchorX,
							y: R.anchorY
						} : Xe
					},
					A = function(q, W) {
						var v = l(q, Qe),
							$ = C(q);
						if(An(v)) {
							var E = v.length,
								j = l(q, "relative"),
								u = W.width,
								Y = W.height;
							if(4 === E) v = {
								x: v[0],
								y: v[1],
								width: v[2],
								height: v[3]
							}, j ? (v.x *= u, v.y *= Y, v.width *= u, v.height *= Y) : W.fitSize && (v.x *= W.widthScale, v.width *= W.widthScale, v.y *= W.heightScale, v.height *= W.heightScale);
							else if(3 === E) {
								var o = v[0];
								v = {
									width: v[1],
									height: v[2]
								}, j ? (v.width *= u, v.height *= Y) : W.fitSize && (v.width *= W.widthScale, v.height *= W.heightScale), "object" == typeof o ? o.length && (o = {
									x: o[0],
									y: o[1]
								}) : o = Uc(o, W, v), v.x = o.x - v.width * $.x, v.y = o.y - v.height * $.y
							}
							var V = l(q, "offsetX");
							V && (W.fitSize && (V *= W.widthScale), v.x += V), V = l(q, "offsetY"), V && (W.fitSize && (V *= W.heightScale), v.y += V)
						}
						return v
					},
					J = function(i) {
						return An(i) ? new ag(i) : i
					},
					k = function(P, Z, p, o, q, R, X) {
						q === S && (q = 1), R === S && (R = 1);
						var b = l(P, "clipPercentage"),
							M = td(p, Z);
						if(M && !o && 1 === q && 1 === R && !(1 > b)) return !1;
						X = X || Xe;
						var n = Z.x + Z.width * X.x,
							K = Z.y + Z.height * X.y,
							G = p.x + p.width * X.x,
							$ = p.y + p.height * X.y;
						if(v.save(), Zg(v, n, K), lo(v, o), $l(v, q * (Z.width / p.width), R * (Z.height / p.height)), Zg(v, -G, -$), 1 > b) {
							0 > b && (b = 0);
							var c = ln(p, l(P, "clipDirection"), b);
							v.beginPath(), v.rect(c.x, c.y, c.width, c.height), v.clip()
						}
						return !0
					},
					I = function() {
						v.restore()
					},
					P = function(b, h, F) {
						var N = l(b, "path"),
							B = l(b, pl),
							J = l(b, "scaleX"),
							f = l(b, "scaleY"),
							w = C(b),
							u = _,
							p = se(null, N);
						if(F || (F = b.unionRect, F || (F = kl(p), b.path.func || (b.unionRect = F)), u = F), F) {
							u || (u = b.unionRect, u || (u = kl(p), b.path.func || (b.unionRect = u)));
							var M = k(b, F, u, B, J, f, w),
								g = l(b, "borderPattern"),
								q = In(v, g),
								d = D(b, "background"),
								r = D(b, "borderColor"),
								O = l(b, "borderWidth"),
								$ = l(b, "gradient"),
								j = D(b, "gradientColor"),
								H = l(b, "border3d"),
								U = l(b, "border3dColor"),
								o = l(b, "border3dAccuracy"),
								Q = v.lineJoin,
								W = v.lineCap;
							if(v.lineJoin = l(b, "borderJoin") || xj, v.lineCap = l(b, "borderCap") || sg, d ? ($c(v, d, $, j, u), se(v, N), v.fill(), q !== v && se(v, N)) : se(v, N), O && r) {
								var n = l(b, "borderWidthAbsolute");
								n && (v.save(), v.setTransform(1, 0, 0, 1, 0, 0)), v.lineWidth = O, v.strokeStyle = r, v.stroke(), n && v.restore(), H && Ud(v, r, U, O, T, o)
							}
							if(Rj(v, g), l(b, "dash")) {
								var Y = l(b, "dashWidth") || O;
								if(Y > 0) {
									g = l(b, "dashPattern") || cs;
									var q = In(v, g, l(b, "dashOffset")),
										t = D(b, "dashColor") || D(am);
									q !== v && se(v, N), v.strokeStyle = t, v.lineWidth = Y, v.stroke(), l(b, "dash3d") && Ud(v, t, D(b, "dash3dColor"), Y, T, l(b, "dash3dAccuracy")), Rj(v, g)
								}
							}
							h === Qe && Nd(v, d, l(b, "depth"), u), v.lineJoin = Q, v.lineCap = W, M && I()
						}
					},
					H = function(j, m, O, A) {
						var t = l(j, re, r),
							F = l(j, pl),
							b = C(j);
						if(t && A.fitSize) {
							var W = Math.abs(Math.cos(F)) < .001,
								N = new ag,
								i = kl(t),
								h = A.widthScale,
								Z = A.heightScale,
								K = i.x + b.x * i.width,
								X = i.y + b.y * i.height,
								q = K * h,
								L = X * Z;
							t.each(function(i) {
								var S = i.x - K,
									p = i.y - X;
								N.add({
									x: q + S * (W ? Z : h),
									y: L + p * (W ? h : Z)
								})
							}), t = N, j.unionRect = null
						}
						var x = l(j, "scaleX"),
							Q = l(j, "scaleY"),
							U = m === xn,
							H = _;
						if(!O && U && (O = j.unionRect, O || (O = kl(t), j.points.func || (j.unionRect = O)), H = O), O) {
							U ? H || (H = j.unionRect, H || (H = kl(t), j.points.func || (j.unionRect = H))) : H = O;
							var E, p, s, w, S = k(j, O, H, F, x, Q, b),
								o = l(j, "borderPattern"),
								z = In(v, o),
								n = D(j, "background"),
								G = Ui(l(j, "repeatImage"), u, e),
								y = l(j, "gradientPack"),
								f = D(j, "borderColor"),
								c = l(j, "borderWidth"),
								B = l(j, "segments", J),
								g = l(j, "gradient"),
								M = D(j, "gradientColor"),
								a = l(j, "border3d"),
								P = l(j, "border3dColor"),
								R = l(j, "border3dAccuracy"),
								d = l(j, "closePath"),
								V = l(j, "fillRule") || "nonzero",
								Mc = v.lineJoin,
								Li = v.lineCap;
							if(v.lineJoin = l(j, "borderJoin") || xj, v.lineCap = l(j, "borderCap") || sg, U)
								if(n || G || y) {
									var xo = l(j, "fillClipPercentage");
									if(1 > xo) {
										0 > xo && (xo = 0);
										var gq = ln(H, l(j, "fillClipDirection"), xo);
										v.save(), v.beginPath(), v.rect(gq.x, gq.y, gq.width, gq.height), v.clip()
									}
									if(Vb(v, t, B, d), y) Rk(v, y);
									else if(G) {
										var me = v,
											pf = u,
											$l = e;
										ko(v, G, u, e, $, Y), v = me, u = pf, e = $l
									} else {
										var me = v;
										$c(v, n, g, M, H), v = me
									}
									v.fill(V), 1 > xo && v.restore(), y && v.restore(), z !== v && Vb(z, t, B, d)
								} else Vb(z, t, B, d);
							else if("roundRect" === m ? E = l(j, "cornerRadius") : "polygon" === m ? E = l(j, "polygonSide") : "arc" === m && (E = l(j, "arcFrom"), p = l(j, "arcTo"), s = l(j, "arcClose"), w = l(j, "arcOval")), n || G || y) {
								var xo = l(j, "fillClipPercentage");
								if(1 > xo) {
									0 > xo && (xo = 0);
									var gq = ln(H, l(j, "fillClipDirection"), xo);
									v.save(), v.beginPath(), v.rect(gq.x, gq.y, gq.width, gq.height), v.clip()
								}
								if(Zn(v, m, H, E, p, s, w), y) Rk(v, y);
								else if(G) {
									var me = v,
										pf = u,
										$l = e;
									ko(v, G, u, e, $, Y), v = me, u = pf, e = $l
								} else $c(v, n, g, M, H);
								v.fill(V), 1 > xo && v.restore(), y && v.restore(), v !== z && Zn(z, m, H, E, p, s, w)
							} else Zn(z, m, H, E, p, s, w);
							if(c && f) {
								var Co = l(j, "borderWidthAbsolute");
								Co && (v.save(), v.setTransform(1, 0, 0, 1, 0, 0)), v.lineWidth = c, v.strokeStyle = f, v.stroke(), Co && v.restore(), a && Ud(v, f, P, c, T, R)
							}
							if(Rj(v, o), l(j, "dash")) {
								var ah = l(j, "dashWidth") || c;
								if(ah > 0) {
									o = l(j, "dashPattern") || cs;
									var z = In(v, o, l(j, "dashOffset")),
										dh = D(j, "dashColor") || D(am);
									z !== v && (U ? Vb(z, t, B, d) : Zn(z, m, H, E, p, s, w)), v.strokeStyle = dh, v.lineWidth = ah, v.stroke(), l(j, "dash3d") && Ud(v, dh, D(j, "dash3dColor"), ah, T, l(j, "dash3dAccuracy")), Rj(v, o)
								}
							}
							m === Qe && Nd(v, n, l(j, "depth"), H), v.lineJoin = Mc, v.lineCap = Li, S && I()
						}
					},
					g = function(S, U) {
						var i = u,
							C = e,
							P = u || l(S, Cr),
							y = e || l(S, "blendMode"),
							G = Ui(l(S, "name"), P, y);
						G && (yq(v, G, l(S, "stretch"), U.x, U.y, U.width, U.height, $, Y, P, null, y), u = i, e = C)
					},
					b = function(E, c) {
						var o = l(E, "text");
						o != _ && ul(v, o, l(E, "font"), D(E, Cr), c.x, c.y, c.width, c.height, l(E, "align"), l(E, "vAlign"))
					},
					j = function(V, i) {
						so(v, D(V, Cr), i.x, i.y, i.width, i.height, l(V, "width"))
					},
					F = function(Q, D) {
						var z = l(Q, Nb),
							O = 0;
						if(z && (z.forEach(function(K) {
								O += K
							}), O > 0)) {
							for(var M = l(Q, "colors") || de, J = l(Q, "startAngle") || 0, C = l(Q, "hollow"), Y = l(Q, Cq), B = l(Q, ie), S = l(Q, qo), i = Y ? new ag : _, u = D.x, W = D.y, y = D.width, b = D.height, A = u + y / 2, t = W + b / 2, k = R(y, b) / 2, n = 0, p = 0; p < z.length; p++) {
								var f = z[p],
									T = Z * f / O,
									E = J + T;
								if(v.fillStyle = M[n++], n === M.length && (n = 0), v.beginPath(), C) {
									var P = A + s(J) * k / 2,
										X = t + L(J) * k / 2,
										F = A + s(E) * k,
										e = t + L(E) * k;
									v.moveTo(P, X), v.arc(A, t, k / 2, J, E, !1), v.lineTo(F, e), v.arc(A, t, k, E, J, !0)
								} else v.moveTo(A, t), v.arc(A, t, k, E, J, !0);
								i && (T = (J + E) / 2, i.add({
									text: jc(Y) ? Y(f, p, O, $) : f,
									x: A + .75 * s(T) * k,
									y: t + .75 * L(T) * k
								})), v.closePath(), v.fill(), J = E
							}
							i && i.each(function(K) {
								ul(v, K.text, B, S, K.x, K.y, 0, 0, Hf)
							})
						}
					},
					d = function(r, m) {
						var R = l(r, Vh);
						if(R && R.length > 0) {
							var g = R.length,
								i = l(r, Cq),
								Q = l(r, ie),
								B = l(r, qo),
								A = i ? new ag : _,
								Z = l(r, "minValue") || 0,
								W = l(r, "maxValue");
							if(W == _ && (W = 0, R.forEach(function(y) {
									y.values.forEach(function(D) {
										W = N(W, D)
									})
								})), Z === W) return;
							for(var M = m.height / (W - Z), D = m.y + W * M, o = l(R[0], Nb).length, H = m.width / (3 * o + 1), T = 2 * H / g, G = 0, J = 0; g > J; J++)
								for(var e = R[J], P = l(e, Cr), p = l(e, "colors"), S = l(e, Nb), Y = 0; o > Y; Y++) {
									p ? v.fillStyle = p[Y] : P ? v.fillStyle = P : (v.fillStyle = de[G++], G === de.length && (G = 0));
									var f = S[Y],
										u = f * M,
										X = m.x + (1 + 3 * Y) * H + J * T;
									if(jo(v, X, D - u, T, u), A) {
										var y = jc(i) ? i(f, Y, e, $) : f,
											E = Re(Q, y).height;
										A.add({
											x: X,
											y: D - u - E,
											width: T,
											height: E,
											text: y
										})
									}
								}
							A && A.each(function(s) {
								ul(v, s.text, Q, B, s.x, s.y, s.width, s.height, Hf)
							})
						}
					},
					E = function(L, k) {
						var R = l(L, Vh);
						if(R && R.length > 0) {
							var h = R.length,
								E = l(R[0], Nb).length,
								p = k.width / (3 * E + 1),
								H = 0,
								c = l(L, "maxValue"),
								S = l(L, Cq),
								Y = l(L, ie),
								I = l(L, qo),
								K = S ? new ag : _;
							if(c == _) {
								c = 0;
								for(var T = 0; E > T; T++) {
									for(var e = 0, x = 0; h > x; x++) e += l(R[x], Nb)[T];
									c = N(c, e)
								}
							}
							if(c > 0) {
								for(var T = 0; E > T; T++)
									for(var s = k.y + k.height, x = 0; h > x; x++) {
										var J = R[x],
											V = l(J, Cr),
											w = l(J, Nb)[T],
											b = w / c * k.height;
										V ? v.fillStyle = V : (v.fillStyle = de[H++], H === de.length && (H = 0)), s -= b;
										var G = {
											x: k.x + (1 + 3 * T) * p,
											y: s,
											width: 2 * p,
											height: b
										};
										jo(v, G.x, G.y, G.width, G.height), K && (G.text = jc(S) ? S(w, T, J, $) : w, K.add(G))
									}
								K && K.each(function(d) {
									ul(v, d.text, Y, I, d.x, d.y, d.width, d.height, Hf)
								})
							}
						}
					},
					p = function(U, N) {
						var y = l(U, Vh);
						if(y && y.length > 0) {
							for(var h = y.length, F = l(y[0], Nb).length, j = N.width / (3 * F + 1), Y = 0, w = l(U, Cq), g = l(U, ie), Q = l(U, qo), z = w ? new ag : _, f = 0; F > f; f++) {
								for(var p = 0, n = 0; h > n; n++) p += l(y[n], Nb)[f];
								if(p > 0) {
									var W = N.y + N.height;
									for(n = 0; h > n; n++) {
										var P = y[n],
											i = l(P, Cr),
											e = l(P, Nb)[f],
											d = e / p * N.height;
										i ? v.fillStyle = i : (v.fillStyle = de[Y++], Y === de.length && (Y = 0)), W -= d;
										var G = {
											x: N.x + (1 + 3 * f) * j,
											y: W,
											width: 2 * j,
											height: d
										};
										jo(v, G.x, G.y, G.width, G.height), z && (G.text = jc(w) ? w(e, f, P, $) : e, z.add(G))
									}
								}
							}
							z && z.each(function(Z) {
								ul(v, Z.text, g, Q, Z.x, Z.y, Z.width, Z.height, Hf)
							})
						}
					},
					O = function(C, V) {
						var S = l(C, Vh);
						if(S && S.length > 0) {
							var g = S.length,
								R = l(C, "minValue") || 0,
								o = l(C, "maxValue");
							if(o == _ && (o = 0, S.forEach(function(D) {
									D.values.forEach(function(v) {
										o = N(o, v)
									})
								})), R === o) return;
							for(var D = V.height / (o - R), s = V.y + o * D, x = l(S[0], Nb).length, A = V.width / (3 * x + 1), M = 0, y = l(C, "lineWidth") || 2, L = l(C, "line3d"), U = l(C, "linePoint"), Q = l(C, Cq), z = l(C, ie), c = l(C, qo), H = 0; g > H; H++) {
								var X = S[H],
									q = l(X, Cr),
									t = l(X, Nb);
								q ? v.strokeStyle = q : (q = v.strokeStyle = de[M++], M === de.length && (M = 0)), v.beginPath();
								for(var b = 0; x > b; b++) {
									var O = V.x + (2 + 3 * b) * A,
										J = s - t[b] * D;
									0 === b ? v.moveTo(O, J) : v.lineTo(O, J)
								}
								if(v.lineWidth = y, v.stroke(), L && Ud(v, q, _, y, T), U || Q) {
									var F, n = y / 2 + 2;
									for(b = 0; x > b; b++) {
										var i = t[b];
										if(O = V.x + (2 + 3 * b) * A, J = s - i * D, jc(U) ? U(v, O, J, q, b, X, $) : U && (v.fillStyle = q, v.beginPath(), v.arc(O, J, n, 0, Z, !0), v.fill()), jc(Q) ? F = Q(i, b, X, $) : Q && (F = i), F) {
											var m = Re(z, F).height,
												h = v.shadowBlur;
											if(h) {
												var W = v.shadowOffsetX,
													e = v.shadowOffsetY,
													w = v.shadowColor;
												v.shadowOffsetX = 0, v.shadowOffsetY = 0, v.shadowBlur = 0, v.shadowColor = _
											}
											ul(v, F, z, c, O, J - m - n + 2, 0, m, Hf), h && (v.shadowOffsetX = W, v.shadowOffsetY = e, v.shadowBlur = h, v.shadowColor = w)
										}
									}
								}
							}
						}
					},
					K = {
						border: j,
						image: g,
						text: b,
						pieChart: F,
						columnChart: d,
						stackedColumnChart: E,
						percentageColumnChart: p,
						lineChart: O
					};
				return function(O, t, B, F, p, M, s, X, q, i) {
					if(t && p && M) {
						v = O, $ = s, Y = X, T = Y ? Y._zoom ? Y._zoom : 1 : 1, u = q, e = i;
						var m = p,
							G = M;
						if(Bn()) {
							var y, g, d;
							0 === v[Zi] ? Bn[0] && (y = !0) : y = !0, v.texureImage2D ? Bn[1] && (g = !0) : g = !0, v.texureImage3D ? Bn[2] && (d = !0) : d = !0, y && g && d && (m = B, G = F)
						}
						if(t.tagName) return v.drawImage(t, m, G, p, M), void 0;
						if(l(t, "visible") !== !1) {
							u || (u = Vo(t.color, $, Y)), i || (e = Vo(t.blendMode, $, Y));
							var b = ui(t, $, Y, p),
								U = Hk(t, $, Y, M),
								N = {
									x: 0,
									y: 0,
									width: b,
									height: U,
									fitSize: l(t, "fitSize")
								},
								R = l(t, "clip"),
								n = l(t, "opacity");
							N.fitSize && (N.widthScale = b / Vo(t.width, $, Y), N.heightScale = U / Vo(t.height, $, Y)), v.save(), Zg(v, m, G), (b !== p || U !== M) && v.scale(p / b, M / U), R && (jc(R) ? R(v, b, U, $, Y, t) : (v.beginPath(), v.rect(0, 0, b, U), v.clip())), n != _ && (v.globalAlpha *= n), l(t, "comps").forEach(function(c) {
								if(l(c, be) !== !1) {
									Df.splice(0, 0, c);
									var p = l(c, "opacity"),
										B = l(c, "shadow"),
										e = l(c, "type"),
										u = A(c, N);
									if(p != _) {
										var E = v.globalAlpha;
										v.globalAlpha *= p
									}
									if(B) {
										var b = v.shadowOffsetX,
											G = v.shadowOffsetY,
											x = v.shadowBlur,
											O = v.shadowColor,
											j = l(c, "shadowOffsetX"),
											y = l(c, "shadowOffsetY"),
											i = l(c, "shadowBlur"),
											L = D(c, "shadowColor");
										v.shadowOffsetX = (j == _ ? 3 : j) * T, v.shadowOffsetY = (y == _ ? 3 : y) * T, v.shadowBlur = (i == _ ? 6 : i) * T, v.shadowColor = L || D(yn)
									}
									if("save" === e) v.save();
									else if("endClip" === e || "restore" === e) v.restore();
									else if("clip" === e) v.save(), Vb(v, l(c, "points", r), l(c, "segments", J), !0), v.clip();
									else if(nd[e]) u = u || {
										x: 0,
										y: 0,
										width: N.width,
										height: N.height
									}, H(c, e, u, N);
									else if(e === xn) H(c, e, u, N);
									else if("SVGPath" === e) P(c, e, u);
									else {
										u = u || {
											x: 0,
											y: 0,
											width: N.width,
											height: N.height
										};
										var g = l(c, pl),
											q = l(c, "scaleX"),
											U = l(c, "scaleY"),
											m = C(c),
											z = k(c, u, u, g, q, U, m);
										if(jc(e)) w(c, e), h.drawCompType(e, v, u, c, $, Y);
										else if(h.getCompType(e)) {
											var f = h.getCompType(e),
												Z = f.func || f;
											w(c, f), h.drawCompType(Z, v, u, c, $, Y)
										} else K[e] ? K[e](c, u) : h.getCompType(e) === S && Fg.test(e) && Mk(e);
										z && I()
									}
									B && (v.shadowOffsetX = b, v.shadowOffsetY = G, v.shadowBlur = x, v.shadowColor = O), p != _ && (v.globalAlpha = E), Df.splice(0, 1)
								}
							}), v.restore()
						}
					}
				}
			}();
		h.getCurrentComp = function() {
				return Df[0]
			}, h.getParentComp = function() {
				return Df[1]
			}, h.getInternal = function() {
				return {
					isEnter: iq,
					isEsc: _f,
					isSpace: ec,
					isLeft: pi,
					isUp: xm,
					isRight: lb,
					isDown: Qh,
					addMethod: yi,
					superCall: wp,
					toPointsArray: Lh,
					translateAndScale: bi,
					appendArray: Fo,
					createWorldMatrix: Uj,
					vec3TransformMat4: ph,
					setCanvas: Mj,
					createDiv: ff,
					createView: Co,
					createCanvas: Qc,
					createImage: mo,
					initContext: wc,
					layout: Pm,
					fillRect: jo,
					Mat: Fi,
					drawBorder: so,
					isString: Ol,
					setBorder: Ur,
					getPropertyValue: kp,
					setPropertyValue: dh,
					drawVerticalLine: Vc,
					draw3DRect: Nd,
					getPinchDist: Ie,
					isSameRect: td,
					getPosition: Uc,
					intersectionLineRect: jh,
					getNodeRect: Dq,
					getEdgeAgentPosition: Te,
					getImageWidth: ui,
					getImageHeight: Hk,
					initItemElement: Tb,
					drawPoints: Vb,
					createG2: In,
					closePopup: hk,
					isH: cn,
					createAnim: Vg,
					createNormalMatrix: Hi,
					createNormals: ic,
					toFloatArray: Bj,
					glMV: Jd,
					batchShape: pd,
					createNodeMatrix: el,
					getFaceInfo: Ag,
					transformAppend: cg,
					drawFaceInfo: Rb,
					to3dPointsArray: vm,
					setGLDebugMode: function(S) {
						xg = S
					},
					cube: function() {
						return {
							vs: wj,
							is: js,
							uv: vo
						}
					},
					ui: function() {
						return {
							DataUI: sp,
							NodeUI: kc,
							EdgeUI: yf,
							GroupUI: Zo,
							ShapeUI: Of,
							GridUI: yd,
							Data3dUI: Zh,
							Node3dUI: Xo,
							Shape3dUI: Wp
						}
					},
					getInternalVersion: function() {
						return "U2FsdGVkX183oi/JTWpoYd0VuM0U3i0HVtteuhpYWP4="
					},
					getDragger: function() {
						return zg
					},
					addMSMap: function(k) {
						yi(Eq, k)
					},
					k: M
				}
			},
			function(u) {
				function F(S, A) {
					S != _ && (A == _ && yr != typeof S ? this._54O(S, 256) : this._54O(S, A))
				}

				function k() {
					return new F(_)
				}

				function o(_, x, z, b, C, m) {
					for(; --m >= 0;) {
						var T = x * this[_++] + z[b] + C;
						C = X(T / 67108864), z[b++] = 67108863 & T
					}
					return C
				}

				function G(S, V, h, T, X, t) {
					for(var d = 32767 & V, i = V >> 15; --t >= 0;) {
						var C = 32767 & this[S],
							p = this[S++] >> 15,
							k = i * C + p * d;
						C = d * C + ((32767 & k) << 15) + h[T] + (1073741823 & X), X = (C >>> 30) + (k >>> 15) + i * p + (X >>> 30), h[T++] = 1073741823 & C
					}
					return X
				}

				function d(F, n, C, H, X, V) {
					for(var g = 16383 & n, t = n >> 14; --V >= 0;) {
						var s = 16383 & this[F],
							r = this[F++] >> 14,
							l = t * s + r * g;
						s = g * s + ((16383 & l) << 14) + C[H] + X, X = (s >> 28) + (l >> 14) + t * r, C[H++] = 268435455 & s
					}
					return X
				}

				function e($) {
					return Rc.charAt($)
				}

				function w(h, V) {
					var g = Dl[h.charCodeAt(V)];
					return g == _ ? -1 : g
				}

				function v(K) {
					for(var L = this.t - 1; L >= 0; --L) K[L] = this[L];
					K.t = this.t, K.s = this.s
				}

				function f(x) {
					this.t = 1, this.s = 0 > x ? -1 : 0, x > 0 ? this[0] = x : -1 > x ? this[0] = x + this.DV : this.t = 0
				}

				function P(m) {
					var e = k();
					return e._58O(m), e
				}

				function D(V, B) {
					var p, b = this;
					if(16 == B) p = 4;
					else if(8 == B) p = 3;
					else if(256 == B) p = 8;
					else if(2 == B) p = 1;
					else if(32 == B) p = 5;
					else {
						if(4 != B) return b.fromRadix(V, B), void 0;
						p = 2
					}
					b.t = 0, b.s = 0;
					for(var C = V.length, e = !1, k = 0; --C >= 0;) {
						var h = 8 == p ? 255 & V[C] : w(V, C);
						0 > h ? "-" == V.charAt(C) && (e = !0) : (e = !1, 0 == k ? b[b.t++] = h : k + p > b.DB ? (b[b.t - 1] |= (h & (1 << b.DB - k) - 1) << k, b[b.t++] = h >> b.DB - k) : b[b.t - 1] |= h << k, k += p, k >= b.DB && (k -= b.DB))
					}
					8 == p && 0 != (128 & V[0]) && (b.s = -1, k > 0 && (b[b.t - 1] |= (1 << b.DB - k) - 1 << k)), b._57O(), e && F.ZERO._78O(b, b)
				}

				function l() {
					for(var X = this, b = X.s & X.DM; X.t > 0 && X[X.t - 1] == b;) --X.t
				}

				function y(A) {
					var f = this;
					if(f.s < 0) return "-" + f._85O()[vh](A);
					var J;
					if(16 == A) J = 4;
					else if(8 == A) J = 3;
					else if(2 == A) J = 1;
					else if(32 == A) J = 5;
					else {
						if(4 != A) return f.toRadix(A);
						J = 2
					}
					var P, z = (1 << J) - 1,
						L = !1,
						S = "",
						E = f.t,
						G = f.DB - E * f.DB % J;
					if(E-- > 0)
						for(G < f.DB && (P = f[E] >> G) > 0 && (L = !0, S = e(P)); E >= 0;) J > G ? (P = (f[E] & (1 << G) - 1) << J - G, P |= f[--E] >> (G += f.DB - J)) : (P = f[E] >> (G -= J) & z, 0 >= G && (G += f.DB, --E)), P > 0 && (L = !0), L && (S += e(P));
					return L ? S : "0"
				}

				function c() {
					var w = k();
					return F.ZERO._78O(this, w), w
				}

				function V() {
					return this.s < 0 ? this._85O() : this
				}

				function x(K) {
					var y = this,
						L = y.s - K.s;
					if(0 != L) return L;
					var T = y.t;
					if(L = T - K.t, 0 != L) return y.s < 0 ? -L : L;
					for(; --T >= 0;)
						if(0 != (L = y[T] - K[T])) return L;
					return 0
				}

				function J(r) {
					var j, Z = 1;
					return 0 != (j = r >>> 16) && (r = j, Z += 16), 0 != (j = r >> 8) && (r = j, Z += 8), 0 != (j = r >> 4) && (r = j, Z += 4), 0 != (j = r >> 2) && (r = j, Z += 2), 0 != (j = r >> 1) && (r = j, Z += 1), Z
				}

				function U() {
					var Y = this;
					return Y.t <= 0 ? 0 : Y.DB * (Y.t - 1) + J(Y[Y.t - 1] ^ Y.s & Y.DM)
				}

				function a(v, r) {
					var L;
					for(L = this.t - 1; L >= 0; --L) r[L + v] = this[L];
					for(L = v - 1; L >= 0; --L) r[L] = 0;
					r.t = this.t + v, r.s = this.s
				}

				function H(e, D) {
					for(var R = e; R < this.t; ++R) D[R - e] = this[R];
					D.t = N(this.t - e, 0), D.s = this.s
				}

				function h(V, s) {
					var i, A = this,
						K = V % A.DB,
						f = A.DB - K,
						b = (1 << f) - 1,
						T = X(V / A.DB),
						y = A.s << K & A.DM;
					for(i = A.t - 1; i >= 0; --i) s[i + T + 1] = A[i] >> f | y, y = (A[i] & b) << K;
					for(i = T - 1; i >= 0; --i) s[i] = 0;
					s[T] = y, s.t = A.t + T + 1, s.s = A.s, s._57O()
				}

				function r(H, e) {
					var Y = this;
					e.s = Y.s;
					var E = X(H / Y.DB);
					if(E >= Y.t) return e.t = 0, void 0;
					var h = H % Y.DB,
						v = Y.DB - h,
						y = (1 << h) - 1;
					e[0] = Y[E] >> h;
					for(var m = E + 1; m < Y.t; ++m) e[m - E - 1] |= (Y[m] & y) << v, e[m - E] = Y[m] >> h;
					h > 0 && (e[Y.t - E - 1] |= (Y.s & y) << v), e.t = Y.t - E, e._57O()
				}

				function K(Z, k) {
					for(var g = this, S = 0, o = 0, l = R(Z.t, g.t); l > S;) o += g[S] - Z[S], k[S++] = o & g.DM, o >>= g.DB;
					if(Z.t < g.t) {
						for(o -= Z.s; S < g.t;) o += g[S], k[S++] = o & g.DM, o >>= g.DB;
						o += g.s
					} else {
						for(o += g.s; S < Z.t;) o -= Z[S], k[S++] = o & g.DM, o >>= g.DB;
						o -= Z.s
					}
					k.s = 0 > o ? -1 : 0, -1 > o ? k[S++] = g.DV + o : o > 0 && (k[S++] = o), k.t = S, k._57O()
				}

				function E(d, C) {
					var X = this.abs(),
						w = d.abs(),
						T = X.t;
					for(C.t = T + w.t; --T >= 0;) C[T] = 0;
					for(T = 0; T < w.t; ++T) C[T + X.t] = X.am(0, w[T], C, T, 0, X.t);
					C.s = 0, C._57O(), this.s != d.s && F.ZERO._78O(C, C)
				}

				function I(c) {
					for(var Y = this.abs(), o = c.t = 2 * Y.t; --o >= 0;) c[o] = 0;
					for(o = 0; o < Y.t - 1; ++o) {
						var y = Y.am(o, Y[o], c, 2 * o, 0, 1);
						(c[o + Y.t] += Y.am(o + 1, 2 * Y[o], c, 2 * o + 1, y, Y.t - o - 1)) >= Y.DV && (c[o + Y.t] -= Y.DV, c[o + Y.t + 1] = 1)
					}
					c.t > 0 && (c[c.t - 1] += Y.am(o, Y[o], c, 2 * o, 0, 1)), c.s = 0, c._57O()
				}

				function Y(e, r, O) {
					var s = e.abs(),
						B = this;
					if(!(s.t <= 0)) {
						var $ = B.abs();
						if($.t < s.t) return r != _ && r._58O(0), O != _ && B._77O(O), void 0;
						O == _ && (O = k());
						var D = k(),
							n = B.s,
							b = e.s,
							U = B.DB - J(s[s.t - 1]);
						U > 0 ? (s._44O(U, D), $._44O(U, O)) : (s._77O(D), $._77O(O));
						var o = D.t,
							l = D[o - 1];
						if(0 != l) {
							var Z = l * (1 << B.F1) + (o > 1 ? D[o - 2] >> B.F2 : 0),
								H = B.FV / Z,
								A = (1 << B.F1) / Z,
								N = 1 << B.F2,
								T = O.t,
								i = T - o,
								P = r == _ ? k() : r;
							for(D._59O(i, P), O._52O(P) >= 0 && (O[O.t++] = 1, O._78O(P, O)), F.ONE._59O(o, P), P._78O(D, D); D.t < o;) D[D.t++] = 0;
							for(; --i >= 0;) {
								var R = O[--T] == l ? B.DM : X(O[T] * H + (O[T - 1] + N) * A);
								if((O[T] += D.am(0, R, O, i, 0, o)) < R)
									for(D._59O(i, P), O._78O(P, O); O[T] < --R;) O._78O(P, O)
							}
							r != _ && (O._45O(o, r), n != b && F.ZERO._78O(r, r)), O.t = o, O._57O(), U > 0 && O._46O(U, O), 0 > n && F.ZERO._78O(O, O)
						}
					}
				}

				function $(t) {
					var E = k();
					return this.abs()._49O(t, _, E), this.s < 0 && E._52O(F.ZERO) > 0 && t._78O(E, E), E
				}

				function O(o) {
					this.m = o
				}

				function p($) {
					return $.s < 0 || $._52O(this.m) >= 0 ? $.mod(this.m) : $
				}

				function i(k) {
					return k
				}

				function B(h) {
					h._49O(this.m, _, h)
				}

				function S(v, r, O) {
					v._47O(r, O), this._74O(O)
				}

				function C(g, w) {
					g._48O(w), this._74O(w)
				}

				function Q() {
					if(this.t < 1) return 0;
					var N = this[0];
					if(0 == (1 & N)) return 0;
					var w = 3 & N;
					return w = 15 & w * (2 - (15 & N) * w), w = 255 & w * (2 - (255 & N) * w), w = 65535 & w * (2 - (65535 & (65535 & N) * w)), w = w * (2 - N * w % this.DV) % this.DV, w > 0 ? this.DV - w : -w
				}

				function z(k) {
					var a = this;
					a.m = k, a.mp = k._50O(), a.mpl = 32767 & a.mp, a.mph = a.mp >> 15, a.um = (1 << k.DB - 15) - 1, a.mt2 = 2 * k.t
				}

				function t(h) {
					var Z = k();
					return h.abs()._59O(this.m.t, Z), Z._49O(this.m, _, Z), h.s < 0 && Z._52O(F.ZERO) > 0 && this.m._78O(Z, Z), Z
				}

				function W(R) {
					var A = k();
					return R._77O(A), this._74O(A), A
				}

				function g(L) {
					for(var T = this; L.t <= T.mt2;) L[L.t++] = 0;
					for(var s = 0; s < T.m.t; ++s) {
						var D = 32767 & L[s],
							X = D * T.mpl + ((D * T.mph + (L[s] >> 15) * T.mpl & T.um) << 15) & L.DM;
						for(D = s + T.m.t, L[D] += T.m.am(0, X, L, s, 0, T.m.t); L[D] >= L.DV;) L[D] -= L.DV, L[++D]++
					}
					L._57O(), L._45O(T.m.t, L), L._52O(T.m) >= 0 && L._78O(T.m, L)
				}

				function Gm(z, c) {
					z._48O(c), this._74O(c)
				}

				function Cr(F, g, G) {
					F._47O(g, G), this._74O(G)
				}

				function wc() {
					return 0 == (this.t > 0 ? 1 & this[0] : this.s)
				}

				function ud(p, f) {
					if(p > 4294967295 || 1 > p) return F.ONE;
					var g = k(),
						Y = k(),
						c = f._73O(this),
						S = J(p) - 1;
					for(c._77O(g); --S >= 0;)
						if(f._76O(g, Y), (p & 1 << S) > 0) f._75O(Y, c, g);
						else {
							var b = g;
							g = Y, Y = b
						}
					return f.revert(g)
				}

				function tm(U, o) {
					var J;
					return J = 256 > U || o._51O() ? new O(o) : new z(o), this.exp(U, J)
				}

				function Dj() {
					var b = this;
					if(b.s < 0) {
						if(1 == b.t) return b[0] - b.DV;
						if(0 == b.t) return -1
					} else {
						if(1 == b.t) return b[0];
						if(0 == b.t) return 0
					}
					return(b[1] & (1 << 32 - b.DB) - 1) << b.DB | b[0]
				}

				function $e(N, U) {
					return new F(N, U)
				}

				function Md() {
					var s = this;
					s.n = _, s.e = 0, s.d = _, s.p = _, s.q = _, s.dmp1 = _, s.dmq1 = _, s._10A = _
				}

				function Kb(S) {
					return S._53O(this.e, this.n)
				}

				function qm(t) {
					var N, f, W, J = "",
						m = 0;
					for(N = 0; N < t.length && t.charAt(N) != Xp; ++N) W = Vj.indexOf(t.charAt(N)), 0 > W || (0 == m ? (J += e(W >> 2), f = 3 & W, m = 1) : 1 == m ? (J += e(f << 2 | W >> 4), f = 15 & W, m = 2) : 2 == m ? (J += e(f), J += e(W >> 2), f = 3 & W, m = 3) : (J += e(f << 2 | W >> 4), J += e(15 & W), m = 0));
					return 1 == m && (J += e(f << 2)), J
				}

				function Ge(x) {
					var H = x.split(""),
						Y = qm(x);
					return H.forEach(function(M) {
						var u = M.length;
						u > 0 && Y && ($o += b(M))
					}), Y
				}

				function Mn(A, K) {
					var O = sc._4O.Util._56O(A, "ss"),
						e = {},
						C = 0;
					return e.v = O == K, e.t = 1, e.s = 0 > C ? -1 : 0, Mm = e.v, C > 0 ? e[0] = C : -1 > C ? e[0] = C + e.DV : e.t = 0, [O, e]
				}

				function df(S) {
					var R = 38,
						s = S.substring(0, R);
					if(s && 30 == s.indexOf("05000420")) {
						var t = ["ss", S.substring(R)];
						return t
					}
					return []
				}

				function ge(Q, _) {
					_ = _.replace(Mc, ""), _ = _.replace(/[ \n]+/g, "");
					var y = $e(_, 16);
					if(y._55O() > this.n._55O()) return 0;
					var k = this._37O(y),
						e = k[vh](16).replace(/^1f+00/, ""),
						O = df(e);
					if(0 == O.length) return !1;
					for(var x, c, n, X = .5, S = Jo, m = [0, .5, .75, .875, .9375], B = [], o = [], g = [], T = Z / S, A = O[1], w = Mn(Q, A)[0], C = 0, H = 0; C < m.length; C++) {
						var N = 0 === C % 2 ? 0 : .5;
						for(x = 0; S >= x; x++) c = (x + N) * T, n = 1 - m[C], B.push(s(c) * X * n, -X + 2 * m[C] * X, -L(c) * X * n), o.push((x + N) / S, n)
					}
					for(C = 0; C < m.length - 1; C++) {
						var W = C * (S + 1),
							P = (C + 1) * (S + 1);
						for(x = 0; S > x; x++) g.push(W + x, P + x + 1, P + x, W + x, W + x + 1, P + x + 1)
					}
					return g.forEach(function(O) {
						H += O
					}), A == w && H > 10
				}
				var Vn, Td = 0xdeadbeefcafe,
					Uh = 15715070 == (16777215 & Td),
					vh = "toString",
					io = "",
					id = "nat",
					Oh = function() {};
				A = u["D" + 11182[vh](j(2, 5))];
				var Yq = F.prototype;
				xf += xe.substr(0, 1);
				var Vb = u.navigator ? u.navigator.appName : "";
				Uh && "Microsoft Internet Explorer" == Vb ? (Yq.am = G, Vn = 30) : Uh && "Netscape" != Vb ? (Yq.am = o, Vn = 26) : (Yq.am = d, Vn = 28), Yq.DB = Vn, Yq.DM = (1 << Vn) - 1, Yq.DV = 1 << Vn;
				var Lj = 52;
				Yq.FV = j(2, Lj), Yq.F1 = Lj - Vn, Yq.F2 = 2 * Vn - Lj;
				var Xc, le, Rc = "0123456789abcdefghijklmnopqrstuvwxyz",
					Dl = [],
					Tq = function(K) {
						return String.fromCharCode(K)
					};
				for(Xc = "0".charCodeAt(0), le = 0; 9 >= le; ++le) Dl[Xc++] = le;
				for(Xc = "a".charCodeAt(0), le = 10; 36 > le; ++le) Dl[Xc++] = le;
				for(Xc = "A".charCodeAt(0), le = 10; 36 > le; ++le) Dl[Xc++] = le;
				var tj = O.prototype;
				tj._73O = p, tj.revert = i, tj._74O = B, tj._75O = S, tj._76O = C;
				var qp = z.prototype;
				qp._73O = t, qp.revert = W, qp._74O = g, qp._75O = Cr, qp._76O = Gm, Yq._77O = v, Yq._58O = f, Yq._54O = D, Yq._57O = l, Yq._59O = a, Yq._45O = H, Yq._44O = h, Yq._46O = r, Yq._78O = K, Yq._47O = E, Yq._48O = I, Yq._49O = Y, Yq._50O = Q, Yq._51O = wc, Yq.exp = ud, Yq.toString = y, Yq._85O = c, Yq.abs = V, Yq._52O = x, Yq._55O = U, Yq.mod = $, Yq._53O = tm, F.ZERO = P(0), F.ONE = P(1), Yq._86O = Dj;
				var Pr = function(O, Q) {
					var S = this;
					S.isPublic = !0, typeof O !== yr ? (S.n = O, S.e = Q) : O != _ && Q != _ && O.length > 0 && Q.length > 0 && (S.n = $e(O, 16), S.e = b(Q, 16))
				};
				cc = function() {
					var i, C, e = Ge(Nr),
						q = e.substr(0, 4),
						I = e.substr(4, 2),
						R = e.substr(6, 2),
						V = 1,
						G = !V,
						k = M,
						b = [],
						F = sm.charAt(7);
					if(A && (A[vh]().indexOf(id) < 0 || A[xf][vh]().indexOf(id) < 0 || !e ? i = oh(is[F]) : (e = new A(q - 0, I - V, R - 0), C = e.setHours(9), A[xf]() > C ? i = oh(is[F]) : G = !0)), e && i && k) {
						for(var y in i) b.push(y);
						var x, u = i[b[0]],
							f = i[b[1]],
							n = i[b[2]],
							Y = i[b[4]],
							h = i[b[5]],
							$ = i[b[6]],
							B = Lr._27O(k);
						B && $ && (x = u + f + n + Y + "" + h, x && B._31O(x, $) && (G = !0))
					}
					return G || (Zn = Zk), F
				};
				var Wc = Md.prototype;
				Wc._37O = Kb, Wc._38O = Pr;
				var Vj = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
					Xp = "=",
					Sk = 25,
					Dr = 10,
					Nr = "IBgQAQ==",
					vn = vn || function(I, S) {
						var K = {},
							r = K._7A = {},
							C = r._6A = function() {
								function f() {}
								return {
									_80O: function(y) {
										f.prototype = this;
										var g = new f;
										return y && g._5A(y), g.hasOwnProperty("_82O") || (g._82O = function() {
											g.$super._82O.apply(this, arguments)
										}), g._82O.prototype = g, g.$super = this, g
									},
									_3A: function() {
										var g = this._80O();
										return g._82O.apply(g, arguments), g
									},
									_82O: function() {},
									_5A: function(s) {
										for(var Q in s) s.hasOwnProperty(Q) && (this[Q] = s[Q]);
										s.hasOwnProperty(vh) && (this.toString = s.toString)
									},
									_88O: function() {
										return this._82O.prototype._80O(this)
									}
								}
							}(),
							Q = r._39O = C._80O({
								_82O: function(P, Q) {
									P = this._84O = P || [], this._65O = Q != S ? Q : 4 * P.length
								},
								toString: function(F) {
									return(F || $).stringify(this)
								},
								_89O: function(j) {
									var q = this._84O,
										H = j._84O,
										S = this._65O,
										Y = j._65O;
									if(this._57O(), S % 4)
										for(var k = 0; Y > k; k++) {
											var n = 255 & H[k >>> 2] >>> 24 - 8 * (k % 4);
											q[S + k >>> 2] |= n << 24 - 8 * ((S + k) % 4)
										} else if(H.length > 65535)
											for(var k = 0; Y > k; k += 4) q[S + k >>> 2] = H[k >>> 2];
										else q.push.apply(q, H);
									return this._65O += Y, this
								},
								_57O: function() {
									var C = this._84O,
										W = this._65O;
									C[W >>> 2] &= 4294967295 << 32 - 8 * (W % 4), C.length = q(W / 4)
								},
								_88O: function() {
									var S = C._88O.call(this);
									return S._84O = this._84O.slice(0), S
								},
								_87O: function(G) {
									for(var m = [], $ = 0; G > $; $ += 4) m.push(0 | 4294967296 * T);
									return new Q._82O(m, G)
								}
							}),
							U = K._2A = {},
							$ = U._69O = {
								stringify: function(V) {
									var y, A = V._84O,
										Y = V._65O,
										J = [];
									for(y = 0; Y > y; y++) {
										var D = 255 & A[y >>> 2] >>> 24 - 8 * (y % 4);
										J.push((D >>> 4).toString(16)), J.push((15 & D).toString(16))
									}
									return J.join("")
								},
								_68O: function(g) {
									for(var z = g.length, K = [], v = 0; z > v; v += 2) K[v >>> 3] |= b(g.substr(v, 2), 16) << 24 - 4 * (v % 8);
									return new Q._82O(K, z / 2)
								}
							},
							g = U._8A = {
								stringify: function(L) {
									var m, V = L._84O,
										G = L._65O,
										n = [];
									for(m = 0; G > m; m++) {
										var F = 255 & V[m >>> 2] >>> 24 - 8 * (m % 4);
										n.push(Tq(F))
									}
									return n.join("")
								},
								_68O: function(C) {
									var i, t = C.length,
										l = [];
									for(i = 0; t > i; i++) l[i >>> 2] |= (255 & C.charCodeAt(i)) << 24 - 8 * (i % 4);
									return new Q._82O(l, t)
								}
							},
							P = U._9A = {
								stringify: function(r) {
									try {
										return decodeURIComponent(escape(g.stringify(r)))
									} catch(W) {
										throw new Error("")
									}
								},
								_68O: function(w) {
									return g._68O(unescape(encodeURIComponent(w)))
								}
							},
							E = r._32O = C._80O({
								_1A: function() {
									this._83O = new Q._82O, this._23O = 0
								},
								_33O: function(m) {
									typeof m == yr && (m = P._68O(m)), this._83O._89O(m), this._23O += m._65O
								},
								_25O: function(D) {
									var J = this._83O,
										y = J._84O,
										k = J._65O,
										Y = this._79O,
										L = 4 * Y,
										S = k / L;
									S = D ? q(S) : N((0 | S) - this._22O, 0);
									var s = S * Y,
										V = R(4 * s, k);
									if(s) {
										for(var C = 0; s > C; C += Y) this._20O(y, C);
										var U = y.splice(0, s);
										J._65O -= V
									}
									return new Q._82O(U, V)
								},
								_88O: function() {
									var I = C._88O.call(this);
									return I._83O = this._83O._88O(), I
								},
								_22O: 0
							});
						r._66O = E._80O({
							cfg: C._80O(),
							_82O: function(_) {
								this.cfg = this.cfg._80O(_), this._1A()
							},
							_1A: function() {
								E._1A.call(this), this._34O()
							},
							_81O: function(c) {
								return this._33O(c), this._25O(), this
							},
							_72O: function(x) {
								x && this._33O(x);
								var U = this._21O();
								return U
							},
							_79O: 16,
							_26O: function(F) {
								return function(J, h) {
									return new F._82O(h)._72O(J)
								}
							},
							_19O: function(J) {
								return function(q, l) {
									return new x._71O._82O(J, l)._72O(q)
								}
							}
						});
						var x = K._67O = {};
						return K
					}();
				! function() {
					var t = vn,
						d = t._7A,
						I = d._39O,
						M = d._66O,
						L = t._67O,
						K = [],
						b = [];
					! function() {
						function Q(o) {
							for(var U = n(o), t = 2; U >= t; t++)
								if(!(o % t)) return !1;
							return !0
						}

						function w(I) {
							return 0 | 4294967296 * (I - (0 | I))
						}
						for(var O = 2, X = 0; 64 > X;) Q(O) && (8 > X && (K[X] = w(j(O, .5))), b[X] = w(j(O, 1 / 3)), X++), O++
					}();
					var U = [],
						Y = L._41O = M._80O({
							_34O: function() {
								this._64O = new I._82O(K.slice(0))
							},
							_20O: function(O, Z) {
								for(var P = this._64O._84O, n = P[0], u = P[1], H = P[2], _ = P[3], h = P[4], L = P[5], B = P[6], I = P[7], y = 0; 64 > y; y++) {
									if(16 > y) U[y] = 0 | O[Z + y];
									else {
										var M = U[y - 15],
											E = (M << 25 | M >>> 7) ^ (M << 14 | M >>> 18) ^ M >>> 3,
											g = U[y - 2],
											f = (g << 15 | g >>> 17) ^ (g << 13 | g >>> 19) ^ g >>> 10;
										U[y] = E + U[y - 7] + f + U[y - 16]
									}
									var w = h & L ^ ~h & B,
										S = n & u ^ n & H ^ u & H,
										l = (n << 30 | n >>> 2) ^ (n << 19 | n >>> 13) ^ (n << 10 | n >>> 22),
										k = (h << 26 | h >>> 6) ^ (h << 21 | h >>> 11) ^ (h << 7 | h >>> 25),
										x = I + k + w + b[y] + U[y],
										C = l + S;
									I = B, B = L, L = h, h = 0 | _ + x, _ = H, H = u, u = n, n = 0 | x + C
								}
								P[0] = 0 | P[0] + n, P[1] = 0 | P[1] + u, P[2] = 0 | P[2] + H, P[3] = 0 | P[3] + _, P[4] = 0 | P[4] + h, P[5] = 0 | P[5] + L, P[6] = 0 | P[6] + B, P[7] = 0 | P[7] + I
							},
							_21O: function() {
								var C = this._83O,
									g = C._84O,
									$ = 8 * this._23O,
									x = 8 * C._65O;
								return g[x >>> 5] |= 128 << 24 - x % 32, g[(x + 64 >>> 9 << 4) + 14] = X($ / 4294967296), g[(x + 64 >>> 9 << 4) + 15] = $, C._65O = 4 * g.length, this._25O(), this._64O
							},
							_88O: function() {
								var T = M._88O.call(this);
								return T._64O = this._64O._88O(), T
							}
						});
					t._41O = M._26O(Y), t._42O = M._19O(Y)
				}();
				var Mc = new RegExp("");
				Mc.compile("[^0-9a-f]", "gi"), Md._28O = -1, Md._29O = -2, Wc._31O = ge, Wc._63O = ge, Md._43O = -2;
				var bn = new function() {
					var J = this;
					J._5O = function(M, D) {
						if("8" != M.substring(D + 2, D + 3)) return 1;
						var m = b(M.substring(D + 3, D + 4));
						return 0 == m ? -1 : m > 0 && 10 > m ? m + 1 : -2
					}, J._13O = function(Y, M) {
						var n = J._5O(Y, M);
						return 1 > n ? "" : Y.substring(M + 2, M + 2 + 2 * n)
					}, J._12O = function(K, U) {
						var M = J._13O(K, U);
						if("" == M) return -1;
						var X;
						return X = b(M.substring(0, 1)) < 8 ? new F(M, 16) : new F(M.substring(2), 16), X._86O()
					}, J._6O = function(B, x) {
						var h = J._5O(B, x);
						return 0 > h ? h : x + 2 * (h + 1)
					}, J._11O = function(B, C) {
						var y = J._6O(B, C),
							F = J._12O(B, C);
						return B.substring(y, y + 2 * F)
					}, J._10O = function(H, f) {
						var V = J._6O(H, f),
							j = J._12O(H, f);
						return V + 2 * j
					}, J._7O = function(S, C) {
						var M = [],
							s = J._6O(S, C);
						M.push(s);
						for(var c = J._12O(S, C), i = s, R = 0;;) {
							var d = J._10O(S, i);
							if(d == _ || d - s >= 2 * c) break;
							if(R >= 200) break;
							M.push(d), i = d, R++
						}
						return M
					}
				};
				if(bn._90O = Tq(Dr + 24), bn._91O = m + Tq(Dr * Dr + 8), sc == _ || !sc) var sc = {};
				sc._4O != _ && sc._4O || (sc._4O = {});
				var fh = sc._4O;
				sc._4O.Util = new function() {
					var o = this;
					o._56O = function(K) {
						var I = new sc._4O._3O;
						return I._30O(K)
					}, o._4A = function(y) {
						var r = new sc._4O._3O;
						return r._36O(y)
					}, o._11A = function(b) {
						var c = new fh._3O;
						return c._30O(b)
					}
				}, sc._4O._3O = function() {
					var e = this;
					e._8O = function(l, a) {
						if("ss" == l && "cj" == a) {
							try {
								e.md = vn._67O._41O._3A()
							} catch(n) {
								Oh(io)
							}
							e._24O = function($) {
								e.md._81O($)
							}, e._35O = function(V) {
								var N = vn._2A._69O._68O(V);
								e.md._81O(N)
							}, e._60O = function() {
								var g = e.md._72O();
								return g[vh](vn._2A._69O)
							}, e._30O = function(E) {
								return e._24O(E), e._60O()
							}, e._36O = function(Y) {
								return e._35O(Y), e._60O()
							}
						}
					}, e._24O = function() {
						Oh(io)
					}, e._35O = function() {
						Oh(io)
					}, e._60O = function() {
						Oh(io)
					}, e._30O = function() {
						Oh(io)
					}, e._36O = function() {
						Oh(io)
					}, e._8O("ss", "cj")
				}, co = function(B) {
					var Y = Bp[Dk[7]],
						n = 1,
						E = !1;
					if(bd.a != Bp[en]) return bd.a;
					if(bd.forEach(function(p) {
							n *= p
						}), B > n) {
						if(Y) {
							Y = Y.split(bn._90O);
							var C = Y[3],
								o = Y[7],
								g = Y[11],
								M = Y[19],
								$ = Y[23],
								k = Y[27],
								Z = C + o + g + M + $;
							E = ne()(Z, k)
						}
						E || (sp.prototype._42 = Hj)
					} else E = !0;
					return bd.a = E, E
				}, Sk = String.fromCharCode(Sk + 20);
				var Rb = function(G) {
						return G = G.replace(Mc, io), G = G.replace(/[ \n]+/g, io)
					},
					ql = "30",
					Do = "06",
					Pf = "02",
					_q = "03",
					$j = $e,
					th = /^1f+00/,
					Lr = function() {
						var K;
						return K = {
							_18O: function(D) {
								var m = D,
									p = m.replace(/\s+/g, ""),
									y = qm(p);
								return y
							},
							_14O: function(J) {
								var E = this._18O(J),
									_ = this._15O(E);
								return _
							},
							_15O: function(J) {
								var v = this._17O(J);
								if("2a864886f70d010101" == v._61O) {
									var B = this._16O(v.key),
										H = new Md;
									return H._38O(B.n, B.e), H
								}
								Oh(io)
							},
							_16O: function(k) {
								var t = {};
								k.substr(0, 2) != ql && Oh(io);
								var K = bn._7O(k, 0);
								return 2 != K.length && Oh(io), k.substr(K[0], 2) != Pf && Oh(io), t.n = bn._11O(k, K[0]), k.substr(K[1], 2) != Pf && Oh(io), t.e = bn._11O(k, K[1]), t
							},
							_17O: function(p) {
								var u = {};
								u._40O = _;
								var n = bn._7O(p, 0);
								2 != n.length && Oh(io);
								var F = n[0];
								p.substr(F, 2) != ql && Oh(io);
								var W = bn._7O(p, F);
								return 2 != W.length && Oh(io), p.substr(W[0], 2) != Do && Oh(io), u._61O = bn._11O(p, W[0]), p.substr(W[1], 2) == Do ? u._40O = bn._11O(p, W[1]) : p.substr(W[1], 2) == ql && (u._40O = {}, u._40O.p = bn._70O(p, W[1], [0], Pf), u._40O.q = bn._70O(p, W[1], [1], Pf), u._40O.g = bn._70O(p, W[1], [2], Pf)), p.substr(n[1], 2) != _q && Oh(io), u.key = bn._11O(p, n[1]).substr(2), u
							}
						}, K._17O ? K : _
					}(),
					zl = Lr._27O = function(v) {
						return Lr._14O(v)
					};
				ne = function() {
					return function(Q, E) {
						E = Rb(E);
						var s = $j(E, j(2, 4)),
							g = this;
						if(!g || !g.n || s._55O() > g.n._55O()) return 0;
						var L = g._37O(s),
							O = L[vh](j(2, 4)).replace(th, ""),
							Z = df(O);
						if(0 == Z.length) return !1;
						var k = Z[0],
							p = Z[1],
							h = function(F) {
								return sc._4O.Util._56O(F, k)
							},
							H = h(Q);
						return p == H
					}.bind(zl(M))
				};
				var uk, mh;
				return function() {
					var G = gn.length - Rq.length;
					if(G > 0)
						for(var u = 0; G > u; u++) uk = fh.Util, mh = Rb
				}(), Cs = function(x, F) {
					F = mh(F);
					var y = zl(Fb),
						f = hh.length,
						$ = 2 * f,
						P = $j(F, j(f, $)),
						p = y,
						h = !0;
					if(p) {
						var N = p[Lo[0]];
						N && P._55O() <= N._55O() && (h = !1)
					}
					if(h) return 0;
					var H = p._37O(P),
						z = H[vh](j(f, $)).replace(th, ""),
						b = df(z);
					if(0 == b.length) return !1;
					var e = b[0],
						S = b[1],
						I = uk._11A(x, e);
					return S == I
				}, Lr
			}(Y, f);
		var ag = z.List = function() {
			this._as = [];
			var X, u, K = arguments.length;
			if(1 === K) {
				var g = arguments[0];
				if(jg(g) && (g = g._as), An(g))
					for(u = g.length, X = 0; u > X; X++) this._as.push(g[X]);
				else g != _ && this._as.push(g)
			} else if(K > 1)
				for(X = 0; K > X; X++) this._as.push(arguments[X])
		};
		Bm("List", f, {
			forEach: function(Q, i) {
				this.each(Q, i)
			},
			push: function() {
				for(var y = 0; y < arguments.length; y++) this.add(arguments[y])
			},
			pop: function() {
				return this._as.pop()
			},
			shift: function() {
				return this._as.shift()
			},
			unshift: function() {
				return this._as.unshift.apply(this._as, arguments)
			},
			size: function() {
				return this._as.length
			},
			isEmpty: function() {
				return 0 === this._as.length
			},
			add: function(o, U) {
				return U === S ? this._as.push(o) : this._as.splice(U, 0, o)
			},
			addAll: function(G) {
				jg(G) && (G = G._as), An(G) ? Fo(this._as, G) : this._as.push(G)
			},
			get: function(Z) {
				return this._as[Z]
			},
			slice: function(F, x) {
				return new ag(this._as.slice(F, x))
			},
			remove: function(F) {
				var P = this._as.indexOf(F);
				return P >= 0 && P < this._as.length && this.removeAt(P), P
			},
			removeAt: function(Z) {
				return this._as.splice(Z, 1)[0]
			},
			set: function(b, D) {
				return this._as[b] = D
			},
			clear: function() {
				return this._as.splice(0, this._as.length)
			},
			contains: function(V) {
				return this._as.indexOf(V) >= 0
			},
			indexOf: function(R) {
				return this._as.indexOf(R)
			},
			each: function(r, S) {
				for(var u = 0, c = this._as.length; c > u; u++) {
					var j = this._as[u];
					S ? r.call(S, j, u, this) : r(j, u, this)
				}
			},
			reverseEach: function(X, Z) {
				for(var y = this._as.length - 1; y >= 0; y--) {
					var v = this._as[y];
					Z ? X.call(Z, v) : X(v)
				}
			},
			toArray: function(Q, m) {
				if(Q) {
					for(var p, d = [], x = 0, c = this._as.length; c > x; x++) p = this._as[x], m ? Q.call(m, p) && d.push(p) : Q(p) && d.push(p);
					return d
				}
				return this._as.concat()
			},
			toList: function(W, H) {
				if(W) {
					for(var k, x = new ag, m = 0, J = this._as.length; J > m; m++) k = this._as[m], H ? W.call(H, k) && x.add(k) : W(k) && x.add(k);
					return x
				}
				return new ag(this)
			},
			reverse: function() {
				this._as.reverse()
			},
			sort: function(g) {
				return this._as.sort(g ? g : nh), this
			},
			toString: function() {
				return this._as.toString()
			}
		}), f.defineProperties(ag.prototype, {
			length: {
				get: function() {
					return this._as.length
				},
				set: function(H) {
					this._as.length = H
				}
			}
		});
		var Op = new ag;
		yi(Op, {
			size: function() {
				return 0
			},
			indexOf: function() {
				return -1
			},
			contains: function() {
				return !1
			},
			isEmpty: function() {
				return !0
			},
			sort: _k,
			each: _k,
			reverseEach: _k,
			toArray: function() {
				return []
			},
			toList: function() {
				return new ag
			},
			add: jd,
			addAll: jd,
			set: jd,
			remove: jd,
			removeAt: jd,
			clear: jd
		});
		var Fi = z.Matrix = function(o, S, j, q, m) {
			var Y = this;
			o = o || 0;
			var O = L(o),
				P = s(o);
			q = q || 1, m = m || 1, Y.a = P * q, Y.b = O * q, Y.c = -O * m, Y.d = P * m, Y.tx = S || 0, Y.ty = j || 0
		};
		Fi.prototype.tf = function(i, Q) {
			1 === arguments.length && (Q = i.y, i = i.x);
			var L = this;
			return {
				x: L.a * i + L.c * Q + L.tx,
				y: L.b * i + L.d * Q + L.ty
			}
		}, Fi.prototype.translate = function(m, W) {
			var F = this;
			return F.tx += m, F.ty += W, F
		}, Fi.prototype.scale = function(w, r) {
			var f = this;
			return f.a *= w, f.d *= r, f.c *= w, f.b *= r, f.tx *= w, f.ty *= r, f
		}, Fi.prototype.rotate = function(t) {
			var U = s(t),
				x = L(t),
				q = this,
				B = q.a,
				h = q.c,
				d = q.tx;
			return q.a = B * U - q.b * x, q.b = B * x + q.b * U, q.c = h * U - q.d * x, q.d = h * x + q.d * U, q.tx = d * U - q.ty * x, q.ty = d * x + q.ty * U, q
		}, Fi.prototype.transform = function(Q) {
			var w = this,
				p = Q.a,
				U = Q.b,
				v = Q.c,
				D = Q.d,
				G = Q.tx,
				e = Q.ty,
				k = w.a,
				E = w.b,
				J = w.c,
				W = w.d,
				b = w.tx,
				K = w.ty;
			return w.a = p * k + v * E, w.b = U * k + D * E, w.c = p * J + v * W, w.d = U * J + D * W, w.tx = p * b + v * K + G, w.ty = U * b + D * K + e, w
		}, Fi.prototype.tfi = function(T, D) {
			1 === arguments.length && (D = T.y, T = T.x);
			var M = this,
				s = 1 / (M.a * M.d + M.c * -M.b);
			return {
				x: M.d * s * T + -M.c * s * D + (M.ty * M.c - M.tx * M.d) * s,
				y: M.a * s * D + -M.b * s * T + (-M.ty * M.a + M.tx * M.b) * s
			}
		};
		var Vl = z.Notifier = function() {
			this._f = 0
		};
		Bm("Notifier", f, {
			contains: function(X, y) {
				if(this._ls)
					for(var N, M = 0, k = this._ls.size(); k > M; M++)
						if(N = this._ls.get(M), X === N.l && y === N.s) return !0;
				return !1
			},
			add: function(B, k, Z) {
				var H = this,
					X = {
						l: B,
						s: k,
						a: Z
					};
				H._ls || (H._ls = new ag), H._f ? (H._as || (H._as = new ag), H._as.add(X)) : X.a ? H._ls.add(X, 0) : H._ls.add(X)
			},
			remove: function(_, I) {
				var Y = this;
				Y._ls && (Y._f ? (Y._rs || (Y._rs = new ag), Y._rs.add({
					l: _,
					s: I
				})) : Y._remove(_, I))
			},
			_remove: function(p, V) {
				for(var c, T = this._ls, W = 0, x = T.size(); x > W; W++)
					if(c = T.get(W), c.l === p && c.s === V) return T.removeAt(W), void 0
			},
			fire: function(o) {
				var A = this,
					T = A._ls;
				if(A._b = 1e4, T) {
					++A._f;
					try {
						for(var p, O = 0, h = T.size(); h > O; O++) p = T.get(O), p.s ? p.l.call(p.s, o) : p.l(o)
					} finally {
						if(--A._f) return;
						if(A._rs) {
							for(h = A._rs.size(), O = 0; h > O; O++) p = A._rs.get(O), A._remove(p.l, p.s);
							delete A._rs
						}
						if(A._as) {
							for(h = A._as.size(), O = 0; h > O; O++) p = A._as.get(O), p.a ? T.add(p, 0) : T.add(p);
							delete A._as
						}
					}
				}
			}
		});
		var No = z.Data = function() {
			this._id = zm()
		};
		Bm("Data", f, {
			ms_ac: ["tag", "name", "displayName", "icon", "toolTip", "attrObject", "layer", "adjustChildrenToTop", "dataBindings"],
			ms_dm: 1,
			ms_attr: 1,
			_icon: _,
			_parent: _,
			_children: Op,
			_childMap: _,
			_styleMap: _,
			_layer: "0",
			_adjustChildrenToTop: !1,
			getUIClass: function() {
				return _
			},
			_22Q: function() {
				return _
			},
			s: function(e, $) {
				var b = this;
				if(2 === arguments.length) b.setStyle(e, $);
				else {
					if(!Ki(e)) return b.getStyle(e);
					for(var n in e) b.setStyle(n, e[n])
				}
				return b
			},
			fp: function(X, u, s, Q, t) {
				return this.firePropertyChange(X, u, s, Q, t)
			},
			firePropertyChange: function(i, D, t, q, P) {
				if(q) {
					if(q(D, t)) return !1
				} else if(D === t) return !1;
				var f = this,
					H = P || {};
				return H.property = i, H.oldValue = D, H.newValue = t, H.data = f, f._dataModel && f._dataModel.handleDataPropertyChange(H), f.onPropertyChanged(H), !0
			},
			onPropertyChanged: function(o) {
				var c = this,
					G = c._parent,
					S = o.property;
				if(Go(G)) {
					var t = c.s(Wd),
						s = "s:ingroup" === S;
					(t && Li[S] || S === s) && G._81I(), (t || s) && G.fp("childChange", !0, !1)
				}
				fh(G) && Li[S] && G.updateFromChildren()
			},
			_21I: function(S) {
				var O = this;
				if(S && O._dataModel) throw "Remove data from dataModel before adding";
				O._dataModel = S
			},
			removeFromDataModel: function() {
				this._dataModel ? this._dataModel.remove(this) : this.setParent(null)
			},
			clearChildrenFromDataModel: function() {
				for(var i = 0, C = this._children.toArray(), q = C.length; q > i; i++) C[i].removeFromDataModel()
			},
			getId: function() {
				return this._id
			},
			setId: function(K) {
				this._id = K
			},
			getChildren: function() {
				return this._children
			},
			size: function() {
				return this._children.size()
			},
			toChildren: function(p, q) {
				return this._children.toList(p, q)
			},
			eachChild: function(d, i) {
				this._children.each(d, i)
			},
			addChild: function(o, q) {
				var S = this;
				o !== S && (S._children === Op && (S._children = new ag, S._childMap = {}), q >= 0 || (q = S._children.size()), S._childMap[o._id] || S.isDescendantOf(o) || (o._parent && o._parent.removeChild(o), (0 > q || q > S._children.size()) && (q = S._children.size()), S._children.add(o, q), S._childMap[o._id] = o, o.setParent(S), S.onChildAdded(o, q), S.fp(sb, _, o)))
			},
			onChildAdded: function() {},
			removeChild: function(S) {
				var d = this;
				if(d._childMap && d._childMap[S._id]) {
					var r = d._children.remove(S);
					delete d._childMap[S._id], d.fp(sb, S, _), S.setParent(_, r), d.onChildRemoved(S, r)
				}
			},
			onChildRemoved: function() {},
			getChildAt: function(u) {
				return this._children.get(u)
			},
			clearChildren: function() {
				var I = this;
				if(!I._children.isEmpty())
					for(var K = 0, r = I._children.toArray(), x = r.length; x > K; K++) I.removeChild(r[K])
			},
			getParent: function() {
				return this._parent
			},
			setParent: function(B, n) {
				var w = this;
				if(!(w._73I || w._parent === B || w === B || B && B.isDescendantOf(w))) {
					var E, P = w._parent;
					w._parent = B, w._73I = 1, P ? (n == _ && (n = P.getChildren().indexOf(w)), P.removeChild(w)) : w._dataModel && n == _ && (n = w._dataModel.getRoots().indexOf(w)), B && (B.addChild(w), E = B.getChildren().indexOf(w)), delete w._73I, w.fp("parent", P, B, S, {
						oldIndex: n,
						newIndex: E
					}), w.onParentChanged(P, B)
				}
			},
			onParentChanged: function() {},
			hasChildren: function() {
				return this._children.size() > 0
			},
			isEmpty: function() {
				return this._children.isEmpty()
			},
			isRelatedTo: function(N) {
				return N ? this.isDescendantOf(N) || N.isDescendantOf(this) : !1
			},
			isParentOf: function(j) {
				return j && this._childMap ? !!this._childMap[j._id] : !1
			},
			isDescendantOf: function(J) {
				if(!J || J.isEmpty()) return !1;
				for(var d = this._parent; d;) {
					if(J === d) return !0;
					d = d._parent
				}
				return !1
			},
			getStyleMap: function() {
				return this._styleMap
			},
			getStyle: function(l, i) {
				i === S && (i = 1);
				var r = this._styleMap ? this._styleMap[l] : S;
				return r === S && i ? Q[l] : r
			},
			setStyle: function(u, j) {
				var r = this;
				r._styleMap || (r._styleMap = {});
				var n = r._styleMap[u];
				j === S ? delete r._styleMap[u] : r._styleMap[u] = j, r.fp("s:" + u, n, j) && r.onStyleChanged(u, n, j)
			},
			onStyleChanged: function() {},
			iv: function() {
				this.invalidate()
			},
			invalidate: function() {
				this.fp("*", !1, !0)
			},
			toString: function() {
				var O = this;
				return O._displayName || O._name || O._tag || O._id
			},
			toLabel: function() {
				return this._displayName || this._name
			},
			addStyleIcon: function(o, d) {
				var n = this,
					a = n.s(gr);
				a || n.s(gr, a = {}), d ? a[o] = d : delete a[o], n.fp(gr, _, a)
			},
			removeStyleIcon: function(e) {
				var U = this.s(gr);
				if(U) {
					var r = U[e];
					delete U[e], this.fp(gr, _, U)
				}
				return r
			},
			getSerializableProperties: function() {
				return {
					name: 1,
					displayName: 1,
					icon: 1,
					toolTip: 1,
					parent: 1,
					layer: 1,
					tag: 1,
					adjustChildrenToTop: 1,
					dataBindings: 1
				}
			},
			getSerializableStyles: function() {
				var y, h = {};
				for(y in this._styleMap) h[y] = 1;
				return h
			}
		});
		var uk = z.DataModel = function() {
			var Q = this;
			Q._datas = new ag, Q._dataMap = {}, Q._roots = new ag, Q._rootMap = {}, Q._78O = {}, Q._36I = new Vl, Q._35I = new Vl, Q._selectionModel = new fk(Q);
			var Z = Q._29Q = [],
				p = Q._scheduleCallback = function() {
					for(var N = Date.now(), G = 0; G < Z.length; G++) {
						var L = Z[G];
						L.enabled && N - L.lastTime > L.interval && (L.beforeAction && L.beforeAction(), Q.each(function(o) {
							L.action(o)
						}), L.afterAction && L.afterAction(), L.lastTime = N)
					}
					Z.length && (Q._30Q = Y.requestAnimationFrame(p))
				}
		};
		Bm("DataModel", f, {
			ms_fire: 1,
			ms_attr: 1,
			ms_ac: ["layers", "name", "autoAdjustIndex", "hierarchicalRendering", "background", "init"],
			_name: S,
			_autoAdjustIndex: !0,
			_hierarchicalRendering: !1,
			_background: S,
			_init: S,
			sm: function() {
				return this.getSelectionModel()
			},
			mm: function(_, Z, d) {
				this.addDataModelChangeListener(_, Z, d)
			},
			umm: function(o, C) {
				this.removeDataModelChangeListener(o, C)
			},
			md: function(Y, B, D) {
				this.addDataPropertyChangeListener(Y, B, D)
			},
			umd: function(V, W) {
				this.removeDataPropertyChangeListener(V, W)
			},
			mh: function(T, G, n) {
				this.addHierarchyChangeListener(T, G, n)
			},
			umh: function(V, n) {
				this.removeHierarchyChangeListener(V, n)
			},
			getAttrObject: function() {
				return this._attrObject
			},
			setAttrObject: function(I) {
				return this._attrObject = I
			},
			getSelectionModel: function() {
				return this._selectionModel
			},
			size: function() {
				return this._datas.size()
			},
			isEmpty: function() {
				return this._datas.isEmpty()
			},
			getRoots: function() {
				return this._roots
			},
			getDatas: function() {
				return this._datas
			},
			getDataById: function(h) {
				return this._dataMap[h]
			},
			removeDataById: function(Y) {
				this.remove(this.getDataById(Y))
			},
			toDatas: function(F, q) {
				return this._datas.toList(F, q)
			},
			each: function(q, D) {
				this._datas.each(q, D)
			},
			getDataByTag: function(u) {
				return this._78O[u]
			},
			getTagMap: function() {
				return this._78O
			},
			removeDataByTag: function(K) {
				this.remove(this.getDataByTag(K))
			},
			add: function(D, i, R) {
				var n = this,
					M = D._id,
					K = D._tag,
					Q = n._roots;
				if(n._dataMap[M]) throw "'" + M + "' already exists";
				K != _ && (n._78O[K] = D), n._dataMap[M] = D, R >= 0 ? n._datas.add(D, R) : n._datas.add(D), D._parent || (n._rootMap[M] = D, i >= 0 ? Q.add(D, i) : Q.add(D)), D._21I(n), n.onAdded(D), n._36I.fire({
					kind: "add",
					data: D,
					rootsIndex: i,
					datasIndex: R
				})
			},
			onAdded: function() {},
			remove: function(r, O) {
				if(r) {
					var $ = this,
						Z = r._id,
						W = O && O.keepStructure,
						S = O && O.keepChildren,
						E = r.getTag();
					if(r._dataModel === $) {
						this.beginTransaction(), W ? $._removingData || ($._removingData = r) : $.prepareRemove(r), S || r.toChildren().each(function(T) {
							$.remove(T, O)
						}, $), W ? $._removingData === r && (r._parent && r._parent.removeChild(r), delete $._removingData) : r._parent && r._parent.removeChild(r);
						var H = $._datas.remove(r);
						delete $._dataMap[Z], E != _ && delete $._78O[E];
						var U;
						$._rootMap[Z] && (delete $._rootMap[Z], U = $._roots.remove(r)), r._21I(_), $.onRemoved(r), $._36I.fire({
							kind: So,
							data: r,
							rootsIndex: U,
							datasIndex: H
						}), this.endTransaction()
					}
				}
			},
			onRemoved: function() {},
			prepareRemove: function() {},
			clear: function() {
				var f = this;
				if(f._datas.size()) {
					var q = f._historyManager ? this.toJSON() : S;
					f._datas.toArray().forEach(function(t) {
						t._21I(_)
					}), f._datas.clear(), f._dataMap = {}, f._roots.clear(), f._rootMap = {}, f._78O = {}, f._36I.fire({
						kind: gj,
						json: q
					})
				}
			},
			contains: function(T) {
				return T && T._dataModel === this
			},
			handleDataPropertyChange: function(v) {
				var E = this,
					i = v.data,
					Q = v.property;
				if("parent" === Q) {
					var D = i._id,
						J = E._rootMap,
						N = E._roots;
					i._parent ? J[D] && (delete J[D], N.remove(i)) : J[D] || (J[D] = i, N.add(i))
				} else if("tag" === Q) {
					var Y = v.oldValue,
						b = v.newValue,
						c = E._78O;
					Y != _ && delete c[Y], b != _ && (c[b] = i)
				}
				this.onDataPropertyChanged(i, v), this._35I.fire(v)
			},
			onDataPropertyChanged: function() {},
			addDataModelChangeListener: function(Q, H, B) {
				this._36I.add(Q, H, B)
			},
			removeDataModelChangeListener: function(A, v) {
				this._36I.remove(A, v)
			},
			addDataPropertyChangeListener: function(u, z, K) {
				this._35I.add(u, z, K)
			},
			removeDataPropertyChangeListener: function(P, o) {
				this._35I.remove(P, o)
			},
			_38I: function(G, R, $) {
				this._37I && this._37I.fire({
					data: G,
					oldIndex: R,
					newIndex: $
				})
			},
			addHierarchyChangeListener: function($, y, t) {
				this._37I || (this._37I = new Vl), this._37I.add($, y, t)
			},
			removeHierarchyChangeListener: function(C, s) {
				this._37I.remove(C, s)
			},
			getSiblings: function(j) {
				var S = j._parent;
				return S ? S._children : this._roots
			},
			eachByHierarchical: function(i, t, q) {
				if(t) return this._eachByHierarchical(i, t, q);
				for(var h = 0, c = this._roots, v = c.size(); v > h; h++)
					if(this._eachByHierarchical(i, c.get(h), q) === !1) return !1;
				return !0
			},
			_eachByHierarchical: function(W, U, P) {
				if(P) {
					if(W.call(P, U) === !1) return !1
				} else if(W(U) === !1) return !1;
				for(var l = U.size(), k = 0; l > k; k++)
					if(this._eachByHierarchical(W, U.getChildAt(k), P) === !1) return !1;
				return !0
			},
			reverseEachByHierarchical: function(V, I, y) {
				if(I) return this._reverseEachByHierarchical(V, I, y);
				for(var E = this._roots, W = E.size(), s = W - 1; s >= 0; s--)
					if(this._reverseEachByHierarchical(V, E.get(s), y) === !1) return !1;
				return !0
			},
			_reverseEachByHierarchical: function(g, G, c) {
				for(var v = G.size(), j = v - 1; j >= 0; j--)
					if(this._reverseEachByHierarchical(g, G.getChildAt(j), c) === !1) return !1;
				if(c) {
					if(g.call(c, G) === !1) return !1
				} else if(g(G) === !1) return !1;
				return !0
			},
			eachByDepthFirst: function($, Z, w) {
				if(Z) return this._11I($, Z, w);
				for(var T = 0, e = this._roots, P = e.size(); P > T; T++)
					if(this._11I($, e.get(T), w) === !1) return !1;
				return !0
			},
			_11I: function(S, T, o) {
				for(var p = T.size(), v = 0; p > v; v++)
					if(this._11I(S, T.getChildAt(v), o) === !1) return !1;
				if(o) {
					if(S.call(o, T) === !1) return !1
				} else if(S(T) === !1) return !1;
				return !0
			},
			eachByBreadthFirst: function(h, k, w) {
				var e = new ag;
				for(k ? e.add(k) : this._roots.each(e.add, e); e.size() > 0;)
					if(k = e.removeAt(0), k.eachChild(e.add, e), w) {
						if(h.call(w, k) === !1) return !1
					} else if(h(k) === !1) return !1;
				return !0
			},
			moveTo: function(Z, h) {
				var F = this.getSiblings(Z),
					H = F.indexOf(Z);
				H === h || 0 > H || h >= 0 && h <= F.size() && (F.remove(Z), h > F.size() && h--, F.add(Z, h), this._38I(Z, H, h))
			},
			moveUp: function(x) {
				this.moveTo(x, this.getSiblings(x).indexOf(x) - 1)
			},
			moveDown: function(m) {
				this.moveTo(m, this.getSiblings(m).indexOf(m) + 1)
			},
			moveToTop: function(v) {
				this.moveTo(v, 0)
			},
			moveToBottom: function(q) {
				this.moveTo(q, this.getSiblings(q).size())
			},
			moveSelectionUp: function(O) {
				this.beginTransaction(), O || (O = this.sm());
				var Y = new ag;
				Hq(O, Y, this._roots), Y.each(this.moveUp, this), this.endTransaction()
			},
			moveSelectionDown: function(o) {
				this.beginTransaction(), o || (o = this.sm());
				var g = new ag;
				qc(o, g, this._roots), g.each(this.moveDown, this), this.endTransaction()
			},
			moveSelectionToTop: function(m) {
				this.beginTransaction(), m || (m = this.sm());
				var T = new ag;
				xl(m, T, this._roots), T.each(this.moveToTop, this), this.endTransaction()
			},
			moveSelectionToBottom: function(n) {
				this.beginTransaction(), n || (n = this.sm());
				var d = new ag;
				rl(n, d, this._roots), d.each(this.moveToBottom, this), this.endTransaction()
			},
			moveToIndex: function(B, l, i) {
				var U = this.getDatas();
				null == i && (i = U.indexOf(B)), i === l || 0 > i || l >= 0 && l <= U.size() && (U.remove(B), l > U.size() && l--, U.add(B, l), this._76I(B, i, l))
			},
			bringForward: function(w) {
				this.moveToIndex(w, this.getDatas().indexOf(w) + 1)
			},
			bringToFront: function(i) {
				this.moveToIndex(i, this.size())
			},
			sendBackward: function(k) {
				this.moveToIndex(k, this.getDatas().indexOf(k) - 1)
			},
			sendToBack: function(d) {
				this.moveToIndex(d, 0)
			},
			bringSelectionForward: function(t) {
				this.beginTransaction(), t || (t = this.sm());
				for(var I = new ag, b = this.getDatas(), K = !1, H = 0; H < b.size(); H++) {
					var J = b.get(b.size() - 1 - H);
					t.contains(J) ? K && I.add(J) : K = !0
				}
				I.each(this.bringForward, this), this.endTransaction()
			},
			bringSelectionToFront: function(n) {
				this.beginTransaction(), n || (n = this.sm());
				for(var i = new ag, Q = this.getDatas(), $ = 0; $ < Q.size(); $++) {
					var F = Q.get($);
					n.contains(F) && i.add(F)
				}
				i.each(this.bringToFront, this), this.endTransaction()
			},
			sendSelectionBackward: function(W) {
				this.beginTransaction(), W || (W = this.sm());
				for(var Q = new ag, g = this.getDatas(), H = !1, F = 0; F < g.size(); F++) {
					var O = g.get(F);
					W.contains(O) ? H && Q.add(O) : H = !0
				}
				Q.each(this.sendBackward, this), this.endTransaction()
			},
			sendSelectionToBack: function(N) {
				this.beginTransaction(), N || (N = this.sm());
				for(var d = new ag, Y = this.getDatas(), E = 0; E < Y.size(); E++) {
					var s = Y.get(Y.size() - 1 - E);
					N.contains(s) && d.add(s)
				}
				d.each(this.sendToBack, this), this.endTransaction()
			},
			addScheduleTask: function(D) {
				var J = this;
				J.removeScheduleTask(D), D.enabled == _ && (D.enabled = !0), D.interval == _ && (D.interval = 10), D.action == _ && (D.action = _k), D.lastTime = Date.now(), J._29Q.push(D), J._30Q == _ && (J._30Q = Y.requestAnimationFrame(J._scheduleCallback))
			},
			removeScheduleTask: function(T) {
				var e = this,
					J = e._29Q,
					a = J.indexOf(T);
				a >= 0 && J.splice(a, 1), J.length || e._30Q == _ || (Y.cancelAnimationFrame(e._30Q), delete e._30Q)
			},
			getHistoryManager: function() {
				return this._historyManager
			},
			enableHistoryManager: function($) {
				this._historyManager || new z.HistoryManager(this), null != $ && this._historyManager.setMaxHistoryCount($), this._historyManager.setDisabled(!1)
			},
			disableHistoryManager: function() {
				this._historyManager && this._historyManager.setDisabled(!0)
			},
			clearHistoryManager: function() {
				this._historyManager && this._historyManager.clear()
			},
			undo: function(j) {
				this._historyManager && this._historyManager.undo(j)
			},
			redo: function(h) {
				this._historyManager && this._historyManager.redo(h)
			},
			beginTransaction: function() {
				this._historyManager && this._historyManager.beginTransaction()
			},
			endTransaction: function() {
				this._historyManager && this._historyManager.endTransaction()
			},
			addHistory: function(J) {
				this._historyManager && this._historyManager.addHistory(J)
			},
			onHistoryManagerChanged: function() {}
		});
		var fk = z.SelectionModel = function(h) {
			var K = this;
			K._68O = li, K._map = {}, K._73O = new ag, K._74I = new Vl, K._21I(h)
		};
		Bm("SelectionModel", f, {
			ms_fire: 1,
			ms_dm: 1,
			ms: function(T, M, d) {
				this.addSelectionChangeListener(T, M, d)
			},
			ums: function(q, U) {
				this.removeSelectionChangeListener(q, U)
			},
			fd: function() {
				return this.getFirstData()
			},
			ld: function() {
				return this.getLastData()
			},
			sg: function() {
				return this._68O === yg
			},
			co: function(b) {
				return this._map[b._id] != _
			},
			ss: function(d) {
				this.setSelection(d)
			},
			as: function(Q) {
				this.appendSelection(Q)
			},
			rs: function(c) {
				this.removeSelection(c)
			},
			cs: function() {
				this.clearSelection()
			},
			sa: function() {
				this.selectAll()
			},
			getSelectionMode: function() {
				return this._68O
			},
			setSelectionMode: function(W) {
				var C = this;
				if(C._68O !== W && (W === Lo || W === yg || W === li)) {
					C.cs();
					var D = C._68O;
					C._68O = W, C.fp("selectionMode", D, W)
				}
			},
			_21I: function(S) {
				var k = this,
					c = k._dataModel;
				c !== S && (c && (k.cs(), c.umm(k.handleDataModelChange, k)), k._dataModel = S, S.mm(k.handleDataModelChange, k, !0), k.fp(qi, c, S))
			},
			dispose: function() {
				var r = this;
				r.cs(), r._dataModel.umm(r.handleDataModelChange, r)
			},
			handleDataModelChange: function(K) {
				var h = this;
				if(K.kind === So) {
					var R = K.data;
					h.co(R) && (h._73O.remove(R), delete h._map[R._id], h._75I(So, new ag(R)))
				} else K.kind === gj && h.cs()
			},
			getFilterFunc: function() {
				return this._filterFunc
			},
			setFilterFunc: function(H) {
				var Z = this;
				if(Z._filterFunc !== H) {
					Z.cs();
					var a = Z._filterFunc;
					Z._filterFunc = H, Z.fp("filterFunc", a, Z._filterFunc)
				}
			},
			_75I: function(q, e, R, A) {
				R && (this._73O.each(function(i) {
					A[i._id] ? R.remove(i) : R.add(i)
				}), e = R.toList()), this._74I.fire({
					kind: q,
					datas: new ag(e)
				})
			},
			addSelectionChangeListener: function(Y, n, w) {
				this._74I.add(Y, n, w)
			},
			removeSelectionChangeListener: function(v, i) {
				this._74I.remove(v, i)
			},
			_97O: function(p, X) {
				for(var c, W = this, s = 0, S = new ag(p); s < S.size(); s++) c = S.get(s), (W._filterFunc && !W._filterFunc(c) || X && W.co(c) || !X && !W.co(c) || !W._dataModel.contains(c)) && (S.removeAt(s), s--);
				return S
			},
			appendSelection: function(V) {
				var o = this;
				if(o._68O !== Lo) {
					var X, j, K = o._73O,
						c = o._97O(V, !0);
					c.isEmpty() || (o.sg() && (X = new ag(K), j = o._map, K.clear(), o._map = {}, c = new ag(c.get(c.size() - 1))), c.each(function(g) {
						K.add(g), o._map[g._id] = g
					}), o._75I("append", c, X, j))
				}
			},
			removeSelection: function(f) {
				var e = this,
					c = e._97O(f),
					G = 0,
					H = c.size();
				if(0 !== H) {
					for(; H > G; G++) {
						var U = c.get(G);
						e._73O.remove(U), delete e._map[U._id]
					}
					e._75I(So, c)
				}
			},
			toSelection: function(q, h) {
				return this._73O.toList(q, h)
			},
			getSelection: function() {
				return this._73O
			},
			each: function(B, C) {
				this._73O.each(B, C)
			},
			setSelection: function(I) {
				var i = this,
					A = i._73O;
				if(i._68O !== Lo && !(A.isEmpty() && !I || 1 === A.size() && i.ld() === I)) {
					var e = new ag(A),
						Y = i._map;
					A.clear(), i._map = {};
					var R = i._97O(I, !0);
					i.sg() && R.size() > 1 && (R = new ag(R.get(R.size() - 1))), R.each(function(X) {
						A.add(X), i._map[X._id] = X
					}), i._75I("set", _, e, Y)
				}
			},
			clearSelection: function() {
				var J = this,
					N = J._73O;
				if(N.size() > 0) {
					var Z = N.toList();
					N.clear(), J._map = {}, J._75I(gj, Z)
				}
			},
			selectAll: function() {
				var d = this;
				if(d._68O !== Lo) {
					var u, T, n = d._dataModel.toDatas();
					if(d._filterFunc)
						for(u = 0; u < n.size(); u++) T = n.get(u), d._filterFunc(T) || (n.removeAt(u), u--);
					var Z = d._73O,
						x = new ag(Z),
						f = d._map;
					Z.clear(), d._map = {}, d.sg() && n.size() > 1 && (n = new ag(n.get(n.size() - 1)));
					var z = n.size();
					for(u = 0; z > u; u++) T = n.get(u), Z.add(T), d._map[T._id] = T;
					d._75I("all", _, x, f)
				}
			},
			size: function() {
				return this._73O.size()
			},
			isEmpty: function() {
				return this._73O.isEmpty()
			},
			contains: function(u) {
				return this._map[u._id] != _
			},
			getLastData: function() {
				var d = this._73O;
				return d.size() > 0 ? d.get(d.size() - 1) : _
			},
			getFirstData: function() {
				var $ = this._73O;
				return $.size() > 0 ? $.get(0) : _
			},
			isSelectable: function(E) {
				var n = this;
				return E && n._68O !== Lo ? n._filterFunc ? n._filterFunc(E) : !0 : !1
			},
			getTopSelection: function() {
				var z = this,
					N = new ag;
				return z._73O.each(function(o) {
					for(var Q = o.getParent(); Q;) {
						if(z.contains(Q)) {
							o = _;
							break
						}
						Q = Q.parent
					}
					o && N.add(o)
				}), N
			}
		});
		var Dq = function() {
			return $f(0),
				function(Z, B) {
					var c;
					if(Ef(B)) {
						var C = Z.getDataUI(B);
						C && C._88I && (c = C._88I.rect)
					}
					return c ? c : B.getRect()
				}
		}();
		yi(h, {
			edgeGroupAgentFunc: _,
			graphViewAutoScrollZone: 16,
			graphViewResettable: !1,
			graphViewPannable: !0,
			graphViewRectSelectable: !0,
			graphViewScrollBarVisible: !0,
			graphViewRectSelectBorderColor: p.rectSelectBorder,
			graphViewRectSelectBackground: Wc,
			graphViewEditPointSize: k ? 17 : 7,
			graphViewEditPointBorderColor: p.editPointBorder,
			graphViewEditPointBackground: p.editPointBackground,
			setEdgeType: function(H, n, j) {
				tr[H] = n, gq[H] = j
			},
			getEdgeType: function(y) {
				return tr[y]
			},
			getEdgeTypeMap: function() {
				return tr
			},
			getNodeRect: Dq
		}, !0), yi(Q, {
			"2d.selectable": !0,
			"2d.visible": !0,
			"2d.movable": !0,
			"2d.editable": !0,
			"2d.move.mode": S,
			"image.stretch": "fill",
			icons: S,
			ingroup: !0,
			"body.color": S,
			opacity: S,
			pixelPerfect: !0,
			"clip.direction": "top",
			"clip.percentage": 1,
			"select.color": om,
			"select.width": 1,
			"select.padding": 2,
			"select.type": Qe,
			shadow: !1,
			"shadow.blur": 6,
			"shadow.offset.x": 3,
			"shadow.offset.y": 3,
			"border.color": S,
			"border.width": 2,
			"border.padding": 2,
			"border.type": Qe,
			label: S,
			"label.font": S,
			"label.color": jr,
			"label.background": S,
			"label.position": 31,
			"label.position.fixed": !1,
			"label.offset.x": 0,
			"label.offset.y": 2,
			"label.rotation": S,
			"label.max": S,
			"label.opacity": S,
			"label.scale": 1,
			"label.align": S,
			"label.selectable": !0,
			label2: S,
			"label2.font": S,
			"label2.color": jr,
			"label2.background": S,
			"label2.position": 34,
			"label2.position.fixed": !1,
			"label2.offset.x": 0,
			"label2.offset.y": -2,
			"label2.rotation": S,
			"label2.max": S,
			"label2.opacity": S,
			"label2.scale": 1,
			"label2.align": S,
			"label2.selectable": !0,
			note: S,
			"note.expanded": !0,
			"note.font": S,
			"note.color": rf,
			"note.background": om,
			"note.position": 8,
			"note.offset.x": -3,
			"note.offset.y": 3,
			"note.max": S,
			"note.toggleable": !0,
			"note.border.width": 1,
			"note.border.color": S,
			"note.opacity": S,
			"note.scale": 1,
			"note.align": S,
			note2: S,
			"note2.expanded": !0,
			"note2.font": S,
			"note2.color": rf,
			"note2.background": om,
			"note2.position": 3,
			"note2.offset.x": 3,
			"note2.offset.y": -3,
			"note2.max": S,
			"note2.toggleable": !0,
			"note2.border.width": 1,
			"note2.border.color": S,
			"note2.opacity": S,
			"note2.scale": 1,
			"note2.align": S,
			"group.type": S,
			"group.image": S,
			"group.image.stretch": "fill",
			"group.repeat.image": S,
			"group.padding": 8,
			"group.padding.left": 0,
			"group.padding.right": 0,
			"group.padding.top": 0,
			"group.padding.bottom": 0,
			"group.position": 17,
			"group.toggleable": !0,
			"group.title.font": S,
			"group.title.color": rf,
			"group.title.background": p.groupTitleBackground,
			"group.title.align": vr,
			"group.background": p.groupBackground,
			"group.depth": 1,
			"group.border.width": 1,
			"group.border.pattern": S,
			"group.border.color": Hc,
			"group.border.cap": sg,
			"group.border.join": xj,
			"group.gradient": _,
			"group.gradient.color": "#FFF",
			shape: S,
			"shape.background": Hc,
			"shape.repeat.image": S,
			"shape.border.width": 0,
			"shape.border.width.absolute": !1,
			"shape.border.color": Hc,
			"shape.border.3d": !1,
			"shape.border.3d.color": S,
			"shape.border.3d.accuracy": S,
			"shape.border.cap": sg,
			"shape.border.join": xj,
			"shape.border.pattern": S,
			"shape.gradient": _,
			"shape.gradient.color": "#FFF",
			"shape.depth": 0,
			"shape.dash": !1,
			"shape.dash.pattern": cs,
			"shape.dash.offset": 0,
			"shape.dash.color": am,
			"shape.dash.width": S,
			"shape.dash.3d": !1,
			"shape.dash.3d.color": S,
			"shape.dash.3d.accuracy": S,
			"shape.polygon.side": 6,
			"shape.arc.from": V,
			"shape.arc.to": Z,
			"shape.arc.close": !0,
			"shape.arc.oval": !1,
			"shape.corner.radius": S,
			"shape.gradient.pack": S,
			"shape.fill.rule": "nonzero",
			"shape.fill.clip.direction": "top",
			"shape.fill.clip.percentage": 1,
			"autolayout.gap": S,
			"autolayout.hgap": S,
			"autolayout.vgap": S,
			"edge.type": S,
			"edge.points": S,
			"edge.segments": S,
			"edge.color": Hc,
			"edge.width": 2,
			"edge.width.absolute": !1,
			"edge.offset": 20,
			"edge.group": 0,
			"edge.expanded": !0,
			"edge.gap": 12,
			"edge.toggleable": !0,
			"edge.center": !1,
			"edge.3d": !1,
			"edge.3d.color": S,
			"edge.3d.accuracy": S,
			"edge.cap": sg,
			"edge.join": xj,
			"edge.source.position": 17,
			"edge.source.anchor.x": S,
			"edge.source.anchor.y": S,
			"edge.source.offset.x": 0,
			"edge.source.offset.y": 0,
			"edge.target.position": 17,
			"edge.target.anchor.x": S,
			"edge.target.anchor.y": S,
			"edge.target.offset.x": 0,
			"edge.target.offset.y": 0,
			"edge.pattern": S,
			"edge.dash": !1,
			"edge.dash.pattern": cs,
			"edge.dash.offset": 0,
			"edge.dash.color": am,
			"edge.dash.width": S,
			"edge.dash.3d": !1,
			"edge.dash.3d.color": S,
			"edge.dash.3d.accuracy": S,
			"edge.independent": !1,
			"attach.row.index": 0,
			"attach.column.index": 0,
			"attach.row.span": 1,
			"attach.column.span": 1,
			"attach.padding": 0,
			"attach.padding.left": 0,
			"attach.padding.right": 0,
			"attach.padding.top": 0,
			"attach.padding.bottom": 0,
			"attach.index": -1,
			"attach.offset": 0,
			"attach.offset.relative": !1,
			"attach.offset.opposite": !1,
			"attach.thickness": S,
			"attach.gap": 0,
			"attach.gap.relative": !1,
			"grid.row.count": 1,
			"grid.column.count": 1,
			"grid.row.percents": S,
			"grid.column.percents": S,
			"grid.border": 1,
			"grid.border.left": 0,
			"grid.border.right": 0,
			"grid.border.top": 0,
			"grid.border.bottom": 0,
			"grid.gap": 1,
			"grid.background": p.gridBackground,
			"grid.depth": 1,
			"grid.cell.depth": -1,
			"grid.cell.border.color": p.gridCellBorderColor,
			"grid.block": S,
			"grid.block.padding": 3,
			"grid.block.width": 1,
			"grid.block.color": p.gridBlockColor,
			text: "",
			"text.align": "left",
			"text.vAlign": "middle",
			"text.color": jr,
			"text.font": sf,
			"text.shadow": !1,
			"text.shadow.color": yn,
			"text.shadow.blur": 6,
			"text.shadow.offset.x": 3,
			"text.shadow.offset.y": 3
		}, !0), yi(uk, {
			_76I: function(x, y, D) {
				this._39I && this._39I.fire({
					data: x,
					oldIndex: y,
					newIndex: D
				})
			},
			addIndexChangeListener: function(B, i, c) {
				var P = this;
				P._39I || (P._39I = new Vl), P._39I.add(B, i, c)
			},
			removeIndexChangeListener: function(q, S) {
				this._39I.remove(q, S)
			},
			prepareRemove: function(N) {
				Tk(N) && (N.setSource(_), N.setTarget(_)), N._70O && N._70O.toList().each(this.remove, this), N._69O && N._69O.toList().each(function(s) {
					s.setHost(_)
				}), N._host && N.setHost(_)
			},
			onAdded: function(o) {
				this.isAutoAdjustIndex() && this.adjustIndex(o)
			},
			onDataPropertyChanged: function(t, s) {
				Ub[s.property] && this.isAutoAdjustIndex() && this.adjustIndex(t)
			},
			isAdjustable: function(k) {
				return mm(k) || Tk(k)
			},
			isAdjustedToBottom: function(r) {
				return Go(r) ? r.isExpanded() && Wf(r) : !1
			},
			adjustIndex: function(V) {
				var d = this;
				this.isHierarchicalRendering() || (d.isAdjustedToBottom(V) ? (d.sendToBottom(V), V.eachChild(d.adjustIndex, d)) : d.sendToTop(V))
			},
			sendToTop: function(g) {
				var z = this;
				if(z.contains(g) && z.isAdjustable(g)) {
					var N = z._datas;
					if(g !== N.get(z.size() - 1)) {
						var E = N.indexOf(g);
						N.removeAt(E), N.add(g), z._76I(g, E, z.size() - 1)
					}
					if(Tk(g)) {
						var s = g._40I;
						s && !z.isAdjustedToBottom(s) && z.sendToTop(s), s = g._41I, s && !z.isAdjustedToBottom(s) && z.sendToTop(s)
					}
					g._69O && g._69O.each(function(s) {
						s.isRelatedTo(g) || mm(g) && s.isLoopedHostOn(g) || z.sendToTop(s)
					}), g.ISubGraph || (!Go(g) || g.isExpanded()) && g._adjustChildrenToTop && g.eachChild(function(A) {
						Tk(A) || z.sendToTop(A)
					})
				}
			},
			sendToBottom: function(J, Q) {
				var m = this;
				if(J !== Q && m.contains(J) && m.isAdjustable(J) && (!Q || m.contains(Q))) {
					var l = m._datas,
						d = l.remove(J),
						i = Q ? m._datas.indexOf(Q) : 0;
					if(l.add(J, i), d !== i) {
						m._76I(J, d, i);
						var F = J._parent;
						!F || F.ISubGraph || Tk(F) || m.sendToBottom(J._parent, J)
					}
				}
			}
		}), yi(Eq, {
			ms_edit: function(P) {
				P._46O = function(h) {
					var Y = this,
						V = Y.gv.dm(),
						C = Y._index,
						M = Y._89I,
						_ = Y._node,
						G = Y._shape,
						t = Y._edge,
						T = Y._77I;
					_ && M ? (this.fi({
						kind: "endEditRect",
						event: h,
						data: _,
						direction: M
					}), V.endTransaction()) : G && C >= 0 ? (Y.fi({
						kind: "endEditPoint",
						event: h,
						data: G,
						index: C
					}), V.endTransaction()) : t && C >= 0 ? (Y.fi({
						kind: "endEditPoint",
						event: h,
						data: t,
						index: C
					}), V.endTransaction()) : T && (Y.fi({
						kind: "endEditRotation",
						event: h,
						data: T
					}), V.endTransaction())
				}, P._78I = function(H) {
					var y = this;
					y.autoScroll(H);
					var i = y.gv.lp(H),
						s = y._index,
						z = y._89I,
						a = y._node,
						r = y._shape,
						G = y._edge,
						u = y._77I;
					if(a && z) y._80O(i), y.fi({
						kind: "betweenEditRect",
						event: H,
						data: a,
						direction: z
					});
					else if(r && s >= 0) i.e = r.getPoints().get(s).e, r.setPoint(s, i), y.fi({
						kind: "betweenEditPoint",
						event: H,
						data: r,
						index: s
					});
					else if(G && s >= 0) {
						var q = G.s(tq);
						i.e = q.get(s).e, q.set(s, i), G.fp(tq, _, q), y.fi({
							kind: "betweenEditPoint",
							event: H,
							data: G,
							index: s
						})
					} else if(u) {
						var w = u.p(),
							g = u.getScale(),
							O = o + c(i.y - w.y, i.x - w.x);
						g.y < 0 && (O += V), d(O) < .04 && (O = 0), u.setRotation(O), y.fi({
							kind: "betweenEditRotation",
							event: H,
							data: u
						})
					}
				}, P._80O = function(x) {
					var h = this,
						Y = h._node,
						w = h._rect,
						W = w.x,
						V = w.y,
						J = w.width,
						p = w.height,
						S = h._89I,
						a = h._anchor,
						s = h._matrix,
						x = s.tfi(x);
					"northwest" === S ? w = kl(x, {
						x: W + J,
						y: V + p
					}) : S === un ? w = kl({
						x: W,
						y: x.y
					}, {
						x: W + J,
						y: V + p
					}) : "northeast" === S ? w = kl({
						x: W,
						y: x.y
					}, {
						x: x.x,
						y: V + p
					}) : S === xe ? w = kl({
						x: x.x,
						y: V
					}, {
						x: W + J,
						y: V + p
					}) : S === Ql ? w = kl({
						x: W,
						y: V
					}, {
						x: x.x,
						y: V + p
					}) : "southwest" === S ? w = kl({
						x: x.x,
						y: V
					}, {
						x: W + J,
						y: x.y
					}) : "south" === S ? w = kl({
						x: W,
						y: V
					}, {
						x: W + J,
						y: x.y
					}) : "southeast" === S && (w = kl({
						x: W,
						y: V
					}, x)), Y.setPosition(s.tf(w.x + w.width * a.x, w.y + w.height * a.y)), Y.setWidth(w.width), Y.setHeight(w.height)
				}, P._80I = function(T, F, c, D) {
					var h = this,
						Y = h.gv._zoom,
						f = (h.gv.getEditPointSize() + 2) / Y;
					return Qf({
						x: F - f / 2,
						y: c - f / 2,
						width: f,
						height: f
					}, T) ? (h._89I !== D && (h._89I = D), !0) : !1
				}, P._79I = function(u, q, O) {
					var j = this,
						F = j.gv,
						a = q ? F.getDataUI(q) : _,
						V = a ? a._55O : _;
					if(V) {
						var v, P, z, e, g = F._zoom,
							m = (F.getEditPointSize() + 2) / g,
							A = F.lp(u);
						if(mm(q)) {
							if(V._56O && mm(q) && (P = V._98o, Qf({
									x: P.x - m / 2,
									y: P.y - m / 2,
									width: m,
									height: m
								}, A))) return j._77I = q, O && j.fi({
								kind: "beginEditRotation",
								event: u,
								data: q
							}), j.setCursor("crosshair"), !0;
							if(V._43O && q instanceof Mf)
								for(z = q.getPoints(), v = z.size() - 1; v >= 0; v--)
									if(P = z.get(v), Qf({
											x: P.x - m / 2,
											y: P.y - m / 2,
											width: m,
											height: m
										}, A)) return j._index = v, j._shape = q, O && j.fi({
										kind: "beginEditPoint",
										event: u,
										data: q,
										index: v
									}), j.setCursor("crosshair"), !0;
							if(V._42O)
								for(var b = q.getEditControlPoints(), Z = ["northwest", -1, -1, xe, -1, 0, "southwest", -1, 1, "south", 0, 1, "southeast", 1, 1, Ql, 1, 0, "northeast", 1, -1, un, 0, -1], v = 0, e = b.length; e > v; v++) {
									var p = Z[3 * v],
										x = b[v];
									if(j._80I(A, x.x, x.y, p)) {
										j._node = q;
										var D = q.getWidth(),
											l = q.getHeight(),
											R = q.getAnchor();
										j._rect = {
											x: -D * R.x,
											y: -l * R.y,
											width: D,
											height: l
										}, j._anchor = R, j._matrix = q.getMatrix();
										var Q = q.getRotation(),
											H = s(Q),
											E = L(Q),
											K = Z[3 * v + 1] * id(q.getScale().x),
											h = Z[3 * v + 2] * id(q.getScale().y),
											C = Math.atan2(-E * K - H * h, H * K - E * h),
											S = (Math.round(C / (Math.PI / 4)) + 8) % 8,
											U = [Ci, "nesw-resize", sm, "nwse-resize", Ci, "nesw-resize", sm, "nwse-resize"][S];
										return j.setCursor(U), O && j.fi({
											kind: "beginEditRect",
											event: u,
											data: q,
											direction: j._89I
										}), !0
									}
								}
						}
						if(V._43O && Tk(q) && q.s(rb) === re && (z = q.s(tq)))
							for(v = z.size() - 1; v >= 0; v--)
								if(P = z.get(v), Qf({
										x: P.x - m / 2,
										y: P.y - m / 2,
										width: m,
										height: m
									}, A)) return j._index = v, j._edge = q, O && j.fi({
									kind: "beginEditPoint",
									event: u,
									data: q,
									index: v
								}), j.setCursor("crosshair"), !0
					}
					return !1
				}
			},
			ms_gv: function(T) {
				T._currentSubGraph = _, T.upSubGraph = function() {
					this.setCurrentSubGraph(yh(this._currentSubGraph))
				}, T.isVisible = function(H) {
					var o = this;
					if(yh(H) !== o._currentSubGraph) return !1;
					if(Tk(H)) {
						var D = H._40I,
							i = H._41I;
						if(!D || !i) return !1;
						if(!(H.s("edge.independent") || o.isVisible(D) && o.isVisible(i))) return !1;
						if(H.isEdgeGroupHidden()) return !1
					} else
						for(var x = H._parent; x && !x.ISubGraph;) {
							if(Go(x) && (!x.isExpanded() || !o.isVisible(x))) return !1;
							x = x._parent
						}
					if(H._parent instanceof es && !o.isVisible(H._parent)) return !1;
					if(H._refGraph instanceof Ao && !o.isVisible(H._refGraph)) return !1;
					if(o instanceof yo) {
						if(!H.s("3d.visible")) return !1
					} else {
						var s = o.getLayersInfo();
						if(s) {
							var t = s[H._layer];
							if(t && t.visible === !1) return !1
						}
						if(!H.s("2d.visible")) return !1
					}
					return o._visibleFunc ? o._visibleFunc(H) : !0
				}, T.handleSelectionChange = function(U) {
					var k = this;
					U.datas.each(function(P) {
						k.invalidateData(P);
						var p = P._parent;
						Go(p) && mm(P) && P.s(Wd) && (k.invalidateData(p), p._49I && p._49I.each(function(M) {
							k.invalidateData(M)
						}))
					}), k.onSelectionChanged(U)
				}, T.onSelectionChanged = function(e) {
					var A = this,
						S = A.sm();
					if(1 === S.size() && ("set" === e.kind || "append" === e.kind)) {
						var P = S.ld();
						A.isAutoMakeVisible() && A.makeVisible(P), A.adjustIndex && A._dataModel.isAutoAdjustIndex() && A.adjustIndex(P)
					}
				}, T.makeVisible = function(w) {
					if(w) {
						var y = this,
							Z = y.getDataUI ? y.getDataUI(w) : y.getData3dUI(w);
						if(Z) {
							var U = w,
								v = yh(w);
							for(v !== y._currentSubGraph && y.setCurrentSubGraph(v);
								(U = U._parent) && U !== v;) Go(U) && U.setExpanded(!0);
							y._23I = w, y.iv()
						}
					}
				}, T.getLabel = function(a) {
					var A = a.getStyle(Cq);
					return A === S ? a.getName() : A
				}, T.getLabelBackground = function(U) {
					return U.getStyle("label.background")
				}, T.getLabelColor = function(H) {
					return H.getStyle("label.color")
				}, T.getLabel2 = function(c) {
					return c.getStyle("label2")
				}, T.getLabel2Background = function(L) {
					return L.getStyle("label2.background")
				}, T.getLabel2Color = function(w) {
					return w.getStyle("label2.color")
				}, T.getNote = function($) {
					return $.getStyle(ef)
				}, T.getNoteBackground = function(i) {
					return i.getStyle("note.background")
				}, T.getNote2 = function(h) {
					return h.getStyle(hf)
				}, T.getNote2Background = function(N) {
					return N.getStyle("note2.background")
				}, T.handleClick = function(K, T, X) {
					var S = this;
					T ? (S.fi({
						kind: "clickData",
						event: K,
						data: T,
						part: X
					}), S.onDataClicked(T, K)) : (S.fi({
						kind: "clickBackground",
						event: K
					}), S.onBackgroundClicked(K))
				}, T.handleDoubleClick = function(h, J, C) {
					var H = this;
					Ln(h) && (J ? (H.fi({
						kind: "doubleClickData",
						event: h,
						data: J,
						part: C
					}), H.onDataDoubleClicked(J, h, C), H.checkDoubleClickOnNote(h, J, C) || H.checkDoubleClickOnRotation && H.checkDoubleClickOnRotation(h, J, C) || (Tk(J) ? H.onEdgeDoubleClicked(J, h, C) : J.ISubGraph ? H.onSubGraphDoubleClicked(J, h, C) : Go(J) ? H.onGroupDoubleClicked(J, h, C) : J.IDoorWindow ? H.onDoorWindowDoubleClicked(J, h, C) : J.ICSGBox && H.onCSGBoxDoubleClicked(J, h, C))) : (H.fi({
						kind: "doubleClickBackground",
						event: h
					}), H.onBackgroundDoubleClicked(h)))
				}, T.onSubGraphDoubleClicked = function(W) {
					this.setCurrentSubGraph(W)
				}, T.onEdgeDoubleClicked = function(f, L) {
					f.ISubGraph && !Sj(L) ? this.setCurrentSubGraph(f) : f.s("edge.toggleable") && f.toggle()
				}, T.onGroupDoubleClicked = function(X) {
					X.s("group.toggleable") && X.toggle()
				}, T.onDoorWindowDoubleClicked = function(T) {
					T.s("dw.toggleable") && T.toggle(!0)
				}, T.onCSGBoxDoubleClicked = function(N, _) {
					var E = this;
					if(E instanceof yo) {
						var B = E.getHitFaceInfo(_);
						B && B.face && N.s(B.face + ".toggleable") && N.toggleFace(B.face, !0)
					}
				}, T.onBackgroundClicked = function() {}, T.onBackgroundDoubleClicked = function() {
					this.upSubGraph()
				}, T.onDataClicked = function() {}, T.onDataDoubleClicked = function() {}, T.onAutoLayoutEnded = function() {}, T.onMoveEnded = function() {}, T.onPanEnded = function() {}, T.onPinchEnded = function() {}, T.onRectSelectEnded = function() {}, T.onZoomEnded = function() {}
			},
			ms_icons: function(w) {
				w.getRotation = function(h) {
					return h == _ ? 0 : h
				}, w._15O = function() {
					var q = this,
						U = q.s(gr);
					if(U) {
						var h = q,
							N = q.data || q._data,
							H = q._38o = {
								icons: U,
								rects: {}
							};
						for(var b in U) {
							var y = U[b],
								K = Vo(y.shape3d, N, h);
							if(!(Vo(y.visible, N, h) === !1 || Vo(y.for3d, N, h) && !q.I3d || K && !q.I3d)) {
								var t = K ? [K] : Vo(y.names, N, h),
									Q = t ? t.length : 0,
									Y = Vo(y.position, N, h) || 3,
									s = Vo(y.offsetX, N, h) || 0,
									I = Vo(y.offsetY, N, h) || 0,
									g = Vo(y.direction, N, h) || Ql,
									m = Vo(y.gap, N, h),
									D = m != _ ? m : 1,
									P = Vo(y.rotation, N, h),
									o = Vo(y.keepOrien, N, h),
									u = Vo(y.rotationFixed, N, h) ? P : q.getRotation(P, o, Y),
									O = _,
									B = H.rects[b] = new Array(Q);
								B.rotation = u;
								for(var r = 0; Q > r; r++) {
									var e, k, L, j, C = t[r];
									if(K) L = 0, j = 0;
									else {
										var n = Ui(C);
										L = Vo(y.width, N, h), j = Vo(y.height, N, h), L == _ && (L = ui(n, N)), j == _ && (j = Hk(n, N))
									}
									if(O ? g === Ql ? s += L / 2 : g === xe ? s -= L / 2 : g === un ? I -= j / 2 : I += j / 2 : O = {
											width: L,
											height: j
										}, q.I3d) {
										var w = -L / 2,
											i = -j / 2;
										k = {
											width: L,
											height: j,
											mat: q._16O(Vo(y.autorotate, N, h), Y, O, Vo(y.face, N, h) || np, Vo(y.t3, N, h), Vo(y.r3, N, h), Vo(y.rotationMode, N, h), s, I),
											vs: new Km([w, -i, 0, w, -i - j, 0, w + L, -i - j, 0, w + L, -i, 0])
										}
									} else e = q.getPosition(Y, s, I, O, Vo(y.positionFixed, N, h)), k = {
										x: e.x - L / 2,
										y: e.y - j / 2,
										width: L,
										height: j
									}, q._68o(k, u);
									B[r] = k, g === Ql ? s += L / 2 + D : g === xe ? s -= L / 2 + D : g === un ? I -= j / 2 + D : I += j / 2 + D
								}
							}
						}
					}
				}
			}
		});
		var Or = {
				1: 1,
				2: 1,
				6: 1,
				9: 1,
				10: 1,
				14: 1,
				15: 1,
				16: 1,
				21: 1,
				22: 1,
				26: 1,
				29: 1,
				30: 1,
				34: 1,
				36: 1,
				38: 1,
				40: 1,
				42: 1,
				45: 1,
				50: 1,
				52: 1,
				54: 1
			},
			Gb = {
				3: 1,
				7: 1,
				11: 1,
				17: 1,
				23: 1,
				27: 1,
				31: 1,
				44: 1,
				46: 1,
				47: 1,
				49: 1
			},
			Bd = {
				translateX: 1,
				translateY: 1,
				zoom: 1,
				scrollBarVisible: 1
			},
			Ub = {
				sourceAgent: 1,
				targetAgent: 1,
				expanded: 1,
				parent: 1,
				host: 1
			},
			Li = {
				position: 1,
				width: 1,
				height: 1,
				expanded: 1,
				rotation: 1,
				anchor: 1,
				scale: 1,
				"s:edge.points": 1
			},
			_n = {
				"edge.type": 1,
				"edge.group": 1
			},
			Fm = {
				rotation: 1,
				rotationX: 1,
				rotationZ: 1
			},
			ah = {
				position: 1,
				width: 1,
				height: 1,
				anchor: 1,
				scale: 1,
				"s:grid.row.count": 1,
				"s:grid.column.count": 1,
				"s:grid.row.percents": 1,
				"s:grid.column.percents": 1,
				"s:grid.border": 1,
				"s:grid.border.left": 1,
				"s:grid.border.right": 1,
				"s:grid.border.top": 1,
				"s:grid.border.bottom": 1,
				"s:grid.gap": 1
			},
			Wm = {
				"attach.row.index": 1,
				"attach.column.index": 1,
				"attach.row.span": 1,
				"attach.column.span": 1,
				"attach.padding": 1,
				"attach.padding.left": 1,
				"attach.padding.right": 1,
				"attach.padding.top": 1,
				"attach.padding.bottom": 1,
				"attach.index": 1,
				"attach.offset": 1,
				"attach.offset.relative": 1,
				"attach.offset.opposite": 1,
				"attach.gap": 1,
				"attach.gap.relative": 1,
				"attach.thickness": 1
			},
			$p = {
				shape: 1,
				thickness: 1,
				position: 1,
				anchor: 1,
				scale: 1
			},
			Sp = function(s, l) {
				if(!s || !Go(l) || l.isEmpty()) return !1;
				for(s = s._parent; Go(s);) {
					if(s === l) return !0;
					s = s._parent
				}
				return !1
			},
			Fp = function(V, d) {
				if(!V || !fh(d) || d.isEmpty()) return !1;
				for(V = V._parent; fh(V);) {
					if(V === d) return !0;
					V = V._parent
				}
				return !1
			},
			yh = function(p) {
				if(!p) return _;
				if(Tk(p)) {
					var b = p._40I,
						Q = p._41I;
					if(!b || !Q) return _;
					var h = yh(b),
						O = yh(Q);
					return h === O ? h : _
				}
				for(var l = p._parent; Tk(l) && !l.ISubGraph;) l = l._parent;
				return l ? l.ISubGraph ? l : yh(l) : _
			},
			ke = function(K, z, D, C) {
				var h = z.getStyle(D) * C;
				h && jk(K, h), h = z.getStyle(D + ".left") * C, h && (K.x -= h, K.width += h), h = z.getStyle(D + ".right") * C, h && (K.width += h), h = z.getStyle(D + ".top") * C, h && (K.y -= h, K.height += h), h = z.getStyle(D + ".bottom") * C, h && (K.height += h), K.width < 0 && (K.width = -K.width, K.x -= K.width), K.height < 0 && (K.height = -K.height, K.y -= K.height)
			},
			Wf = function(S) {
				for(var o, E = 0, T = S.size(); T > E; E++)
					if(o = S.getChildAt(E), mm(o) && Wf(o)) return !0;
				return S.hasAgentEdges()
			},
			Rp = function(A) {
				if(!A) return _;
				for(var w = A._parent; Go(w);) {
					if(!Go(w._parent)) return w.isExpanded() ? A : w;
					w.isExpanded() || (A = w), w = w._parent
				}
				return A
			},
			Pk = function(j, O) {
				if(!j || !O) return _;
				var u, X, F, g = yh(j),
					e = yh(O);
				if(g !== e) {
					for(; e && g !== e;) e = yh(e);
					if(g === e) return j;
					u = new ag, u.add(j, 0);
					for(var k = j._parent; mm(k) && !O.isDescendantOf(k);) u.add(k, 0), k = k._parent;
					for(F = u.size(), X = 0; F > X; X++) {
						var N = u.get(X);
						if(Go(N) && !N.isExpanded()) return N;
						if(N.ISubGraph) return N
					}
					return j
				}
				return j
			},
			Kl = function(j) {
				if(j.isLooped()) return j._source;
				var n = Rp(j._source),
					s = Rp(j._target);
				return n === s ? j._source : Pk(n, s)
			},
			He = function(r) {
				if(r.isLooped()) return r._target;
				var w = Rp(r._source),
					t = Rp(r._target);
				return w === t ? r._target : Pk(t, w)
			},
			Te = function(c, Z, U, O, l, W, J) {
				if(!Z) return _;
				var N, K = Z.getRotation ? Z.getRotation() : 0;
				if(W !== S || J !== S)
					if(W = W === S ? .5 : W, J = J === S ? .5 : J, K && !Ef(Z, c)) {
						var E = Z.getPosition(),
							q = Z.getWidth(),
							w = Z.getHeight(),
							v = Z.getAnchor(),
							f = Z.getScale(),
							b = new Fi(K, E.x, E.y, f.x, f.y);
						U = b.tf((W - v.x) * q, (J - v.y) * w)
					} else N = Dq(c, Z), U = {
						x: N.x + W * N.width,
						y: N.y + J * N.height
					};
				else U = Uc(U, Dq(c, Z));
				if(K) {
					var T = s(K),
						p = L(K),
						x = O * T - l * p;
					l = O * p + l * T, O = x
				}
				return U.x += O, U.y += l, U
			},
			_i = function(p, $) {
				if(!p || !$) return _;
				var c, b, R, B, D, I;
				if(p === $) {
					if(B = p.getLoopedEdges(), !B) return _;
					B = new ag(B)
				} else {
					if(D = p.getAgentEdges(), I = $.getAgentEdges(), !D || !I) return _;
					for(b = D.size(), c = 0; b > c; c++) R = D.get(c), I.contains(R) && (B || (B = new ag), B.add(R))
				}
				if(B)
					for(c = 0; c < B.size(); c++) R = B.get(c), R.getStyle(rb) === re && (R._22I(_), B.removeAt(c), c--);
				return B
			},
			cj = function(L, U) {
				var j = _i(L, U);
				if(j && !j.isEmpty()) {
					if(1 === j.size()) return j.get(0)._22I(_), void 0;
					var p = new ag,
						c = new ag;
					j.each(function(N) {
						var h = N.s("edge.group");
						p.contains(h) || p.add(h)
					}), p.sort(), p.each(function(m) {
						c.add(new z.EdgeGroup(j.toList(function(F) {
							return m === F.s("edge.group")
						}), c))
					}), c.each(function(_) {
						_.each(function(z) {
							z._22I(_)
						})
					})
				}
			},
			$j = function(p, L) {
				if(L) {
					var A = L.rect,
						U = L.color,
						W = L.rotation,
						R = L.labelWidth,
						M = L.background,
						Y = L.opacity,
						e = L.scale,
						N = e != _ && 1 !== e;
					if(Y != _) {
						var E = p.globalAlpha;
						p.globalAlpha *= Y
					}
					if(W || N) {
						p.save();
						var w = A.x + A.width / 2,
							$ = A.y + A.height / 2;
						Zg(p, w, $), W && lo(p, W), N && p.scale(e, e), Zg(p, -w, -$)
					}
					if(M && jo(p, A.x, A.y, A.width, A.height, M), R) {
						var j = A.width,
							g = p.createLinearGradient(A.x, A.y, A.x + j, A.y);
						g.addColorStop(0, U), g.addColorStop(.9, U), g.addColorStop(1, $i), U = g, A.width = R
					}
					ho(p, L.ss, A, L.font, U, L.align), R && (A.width = j), (W || N) && p.restore(), Y != _ && (p.globalAlpha = E)
				}
			},
			Sf = function(g, G) {
				if(G) {
					var A = G.rect,
						i = A.x,
						z = A.y,
						U = A.width,
						d = A.height,
						T = G.background,
						p = G.backgroundImage,
						v = G.borderWidth,
						M = G.borderColor,
						j = G.labelWidth,
						b = G.opacity,
						y = G.scale,
						c = y != _ && 1 !== y;
					if(b != _) {
						var s = g.globalAlpha;
						g.globalAlpha *= b
					}
					if(c) {
						g.save();
						var L = A.x + A.width / 2,
							W = A.y + A.height / 2;
						Zg(g, L, W), g.scale(y, y), Zg(g, -L, -W)
					}
					if(G.expanded) {
						var t = R(8, U / 4),
							J = z + d - 8;
						if(g.fillStyle = T, g.beginPath(), g.moveTo(i, z), g.lineTo(i, J), g.lineTo(i + U / 2, J), g.lineTo(i + U / 2, z + d), g.lineTo(i + U / 2 + t, J), g.lineTo(i + U, J), g.lineTo(i + U, z), g.closePath(), g.fill(), v && (g.lineWidth = v, g.lineJoin = "round", g.lineCap = "round", M ? (g.strokeStyle = M, g.stroke()) : (g.strokeStyle = Ph(T), g.beginPath(), g.moveTo(i + U, z), g.lineTo(i + U, J), g.lineTo(i + U / 2 + t, J), g.lineTo(i + U / 2, z + d), g.stroke(), g.strokeStyle = Ml(T), g.beginPath(), g.moveTo(i + U, z), g.lineTo(i, z), g.lineTo(i, J), g.lineTo(i + U / 2, J), g.lineTo(i + U / 2, z + d), g.stroke())), p) yq(g, Ui(p), kh, A.x, A.y, A.width, A.height - 8, G.data, G.view);
						else {
							if(A.height -= 8, T = G.color, j) {
								var x = U,
									k = g.createLinearGradient(i, z, i + x, z);
								k.addColorStop(0, T), k.addColorStop(.9, T), k.addColorStop(1, $i), T = k, A.width = j
							}
							ho(g, G.ss, A, G.font, T, G.align), j && (A.width = x), A.height += 8
						}
					} else if(G.icon) wd(g, Ui(G.icon), i, z, U, d, G.data, G.view);
					else {
						var Y = U / 2;
						v && (g.lineWidth = v, g.lineJoin = "round", g.lineCap = "round", g.strokeStyle = M ? M : Ph(T), g.beginPath(), g.arc(i + Y, z + Y, Y, o, 1.6 * V, !0), g.moveTo(i + Y, z + d), g.lineTo(i + U - Y / 5, z + Y), g.stroke(), g.strokeStyle = M ? M : Ml(T), g.beginPath(), g.arc(i + Y, z + Y, Y, 1.6 * V, o, !0), g.moveTo(i + Y, z + d), g.lineTo(i + Y / 5, z + Y), g.stroke()), g.fillStyle = T, g.beginPath(), g.arc(i + Y, z + Y, Y, 0, Z, !0), g.moveTo(i + Y, z + d), g.lineTo(i + U - Y / 5, z + Y), g.lineTo(i + Y / 5, z + Y), g.closePath(), g.fill(), g.fillStyle = G.color, g.beginPath(), g.arc(i + Y, z + Y, Y / 3, 0, Z, !0), g.fill()
					}
					c && g.restore(), b != _ && (g.globalAlpha = s)
				}
			},
			ug = function(C, k) {
				return k > 2 * C ? C : k / 2
			},
			Ih = function(M, d, U, l) {
				if(!M || !d) return 0;
				var y = c(d.y - M.y, d.x - M.x);
				return U || (y = d.x < M.x ? y + V : y), y + l
			},
			Gq = function(S, l, G, y, E, k, I) {
				I && (S.x > l.x || S.x === l.x && S.y > l.y) && (G = Se[G], E = -E);
				var b = Uc(G, {
					x: 0,
					y: 0,
					width: uh(S, l),
					height: 0
				}, k);
				return b.x += y, b.y += E, b = new Fi(c(l.y - S.y, l.x - S.x)).tf(b), b.x += S.x, b.y += S.y, b
			},
			ac = function(O, r, Q, L, o) {
				if(O._19Q = !0, !Q.getEdgeGroup()) return L ? Q.s("edge.gap") : 0;
				var z, U = 0,
					s = 0,
					c = 0;
				if(Q.getEdgeGroup().getSiblings().each(function(O) {
						O.each(function(u) {
							if(r.isVisible(u) && u.s(rb) == o) {
								var a = u.s("edge.gap");
								z ? (s += c / 2 + a / 2, c = a) : (z = u, c = a), u === Q && (U = s)
							}
						})
					}), L) return s - U + c;
				var a = U - s / 2;
				return z && Q._40I !== z._40I && (O._19Q = !1), a
			},
			me = function() {
				var l = function(H) {
					var R = [];
					return H.forEach(function($) {
						R.push({
							x: $.x,
							y: $.y
						}), R.push({
							x: $.x + $.width,
							y: $.y + $.height
						}), R.push({
							x: $.x + $.width,
							y: $.y
						}), R.push({
							x: $.x,
							y: $.y + $.height
						})
					}), R
				};
				return function(F, P, w) {
					if("oval" === F) {
						var t = 0,
							G = w.height / w.width,
							K = G * G,
							H = w.x + w.width / 2,
							o = w.y + w.height / 2,
							d = l(P);
						d.forEach(function(x) {
							var Y = x.x - H,
								M = x.y - o,
								q = Y * Y + M * M / K;
							q > t && (t = q)
						}), t = n(t);
						var T = G * t;
						return {
							x: H - t,
							y: o - T,
							width: 2 * t,
							height: 2 * T
						}
					}
					if("circle" === F) {
						var $ = 0,
							H = w.x + w.width / 2,
							o = w.y + w.height / 2,
							d = l(P);
						return d.forEach(function(B) {
							var l = B.x - H,
								E = B.y - o,
								b = l * l + E * E;
							b > $ && ($ = b)
						}), $ = n($), {
							x: H - $,
							y: o - $,
							width: 2 * $,
							height: 2 * $
						}
					}
					return "roundRect" === F ? (jk(w, R(w.width, w.height) / 16), w) : w
				}
			}(),
			zf = z.graph = {},
			zl = function(v, E, d) {
				xh(m + ".graph." + v, E, d)
			};
		z.layout = {};
		var vp = {
			comps: [{
				type: xn,
				points: [85, 50, 70, 115, 100, 71, 86, 107, 88, 49, 47, 75, 56, 69, 76, 108, 118, 104, 102, 57, 48, 51, 121, 108, 85, 84, 49, 110, 43, 43, 57, 107, 101, 80, 111, 104, 79, 101, 122, 113, 98, 74, 103, 61],
				borderWidth: 1,
				borderColor: _
			}]
		};
		vp[kb] = vp[Yo] = 160, Wi("node_image", mo(30, 30, [{
			type: Qe,
			rect: [4, 5, 22, 16],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [2, 3, 26, 20],
			borderWidth: 1,
			borderColor: Hc
		}, {
			type: Qe,
			rect: [11, 23, 8, 4],
			background: Hc
		}, {
			type: Qe,
			rect: [6, 27, 18, 2],
			background: Hc
		}])), Wi("node_icon", mo(16, 16, [{
			type: Qe,
			rect: [2, 2, 12, 10],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Zb,
			rect: [2, 2, 12, 10],
			width: 1,
			color: Hc
		}, {
			type: Qe,
			rect: [6, 12, 4, 2],
			background: Hc
		}, {
			type: Qe,
			rect: [4, 14, 8, 1],
			background: Hc
		}])), Wi("block_icon", mo(16, 16, [{
			type: Zb,
			rect: [1, 1, 14, 14],
			width: 1,
			color: Hc
		}])), Wi("group_image", mo(66, 39, [{
			type: Qe,
			rect: [44.3, 18, 18.1, 12.8],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [3.3, 17.8, 18.1, 12.8],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [15.8, 3.2, 33.5, 26.4],
			borderWidth: 1,
			borderColor: Hc,
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [26.2, 29.4, 12.8, 4.2],
			background: Hc
		}, {
			type: Qe,
			rect: [21.3, 33.5, 22.5, 2.3],
			background: Hc
		}, {
			type: Qe,
			rect: [5.3, 32.7, 14.1, 2.1],
			background: Hc
		}, {
			type: Qe,
			rect: [9, 30.4, 6.7, 2.4],
			background: Hc
		}, {
			type: Qe,
			rect: [50, 30.7, 6.7, 2.4],
			background: Hc
		}, {
			type: Qe,
			rect: [46.3, 33, 14.1, 2.1],
			background: Hc
		}])), Wi("group_icon", mo(16, 16, [{
			type: Qe,
			rect: [4, 12, 4, 2],
			background: Hc
		}, {
			type: Qe,
			rect: [2, 13, 8, 1],
			background: Hc
		}, {
			type: Qe,
			rect: [12, 12, 2, 1],
			background: Hc
		}, {
			type: Qe,
			rect: [11, 13, 4, 1],
			background: Hc
		}, {
			type: Qe,
			rect: [10, 7, 6, 5],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [1, 2, 10, 10],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Zb,
			rect: [1, 2, 10, 10],
			width: 1,
			color: Hc
		}])), Wi("refGraph_icon", mo(16, 16, [{
			type: "shape",
			borderWidth: 1,
			borderColor: Hc,
			borderCap: "round",
			rotation: .7854,
			points: [12.5502, 6.7981, 12.5502, 6.7981, 12.5502, 4.8181, 12.5502, 3.7981, 12.5502, 2.7781, 11.36687, 1.7981, 10.0502, 1.7981, 8.73354, 1.7981, 7.5502, 2.8181, 7.5502, 3.7981, 7.5502, 4.55989, 7.5502, 7.79805, 7.5502, 7.79805, 7.5502, 7.79805, 7.5502, 9.7981, 10.0502, 9.7981],
			segments: [1, 4, 4, 4, 4, 4]
		}, {
			type: "shape",
			borderWidth: 1,
			borderColor: Hc,
			borderCap: "round",
			rotation: -2.35619,
			points: [8.4498, 11.2019, 8.4498, 11.2019, 8.4498, 9.2219, 8.4498, 8.2019, 8.4498, 7.1819, 7.26646, 6.2019, 5.9498, 6.2019, 4.63313, 6.2019, 3.4498, 7.2219, 3.4498, 8.2019, 3.4498, 8.9637, 3.4498, 12.20186, 3.4498, 12.20186, 3.4498, 12.20186, 3.4498, 14.2019, 5.9498, 14.2019],
			segments: [1, 4, 4, 4, 4, 4]
		}])), Wi("edge_icon", mo(16, 16, [{
			type: Qe,
			rect: [2.1, 6.9, 11.5, 2.6],
			rotation: -.79,
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [10.8, 1, 4, 4],
			background: Hc
		}, {
			type: Qe,
			rect: [1, 11, 4, 4],
			background: Hc
		}])), Wi("subGraph_image", mo(72, 45, [{
			type: xn,
			points: [9, 42, .3, 38.4, 2.4, 28.8, 5.7, 21.6, 11.7, 22.5, 11.7, 15.9, 16.8, 13.8, 21.6, 12, 24.3, 15.9, 27.9, 3, 42.3, 2.1, 59.4, 4.5, 57.3, 18.3, 67.5, 18.9, 69.6, 27.3, 69.9, 38.4, 64.2, 41.4],
			segments: [1, 3, 3, 3, 3, 3, 3, 3, 3],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [29.6, 30.7, 3.6, 1.8],
			background: Hc
		}, {
			type: Qe,
			rect: [28.4, 32.3, 6, 1.2],
			background: Hc
		}, {
			type: Qe,
			rect: [37.3, 32, 10.8, 1.8],
			background: Hc
		}, {
			type: Qe,
			rect: [39.1, 29.9, 7.2, 2.3],
			background: Hc
		}, {
			type: Qe,
			rect: [26.6, 23.7, 9.6, 7.2],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}, {
			type: Qe,
			rect: [34.3, 16.8, 16.8, 13.2],
			borderWidth: 1,
			borderColor: Hc,
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}])), Wi("subGraph_icon", mo(17, 17, [{
			type: xn,
			points: [2.2, 14.6, .2, 11.9, .8, 8.8, 1.8, 5.9, 5.6, 7.4, 3.8, 1.6, 10.3, 3, 14.5, 4.2, 12.2, 7.5, 18.9, 7.2, 14.5, 14.5],
			segments: [1, 3, 3, 3, 3, 3],
			gradient: Xn,
			gradientColor: ji,
			background: Hc
		}])), Wi("shape_icon", mo(16, 16, [{
			type: xn,
			points: [1.5, 1, 8.4, 1, 8.4, 7.2, 14.6, 7.1, 14.6, 14.9, 1.5, 14.9, 1.5, 1],
			background: Hc
		}])), Wi("polyline_icon", mo(16, 16, [{
			type: xn,
			points: [1.5, 1, 8.4, 1, 8.4, 7.2, 14.6, 7.1, 14.6, 14.9, 1.5, 14.9, 1.5, 1],
			borderWidth: 1,
			borderColor: Hc
		}, Pg(7.5, .4), Pg(7.5, 6.3), Pg(13.6, 6.3), Pg(13.6, 14), Pg(.7, 13.9), Pg(.7, .3)])), Wi("grid_icon", mo(16, 16, [{
			type: Qe,
			rect: [1, 1, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [6, 1, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [11, 1, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [11, 6, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [6, 6, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [1, 6, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [11, 11, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [6, 11, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}, {
			type: Qe,
			rect: [1, 11, 4, 4],
			background: Hc,
			gradient: Xn,
			gradientColor: ji
		}])), Wi("light_icon", mo(16, 16, [{
			type: "rect",
			rect: [6, 9, 5, 5],
			borderWidth: 1,
			borderColor: Hc
		}, {
			type: "circle",
			rect: [1, 1, 15, 10],
			borderWidth: 1,
			borderColor: Hc,
			gradient: Xn,
			gradientColor: ji,
			background: {
				func: function(i) {
					var A = i ? i.s(fq) : _;
					return An(A) ? "rgb(" + b(255 * A[0]) + "," + b(255 * A[1]) + "," + b(255 * A[2]) + ")" : A || Hc
				}
			}
		}])), Wi("text_icon", mo(16, 16, [{
			type: "shape",
			points: [3, 3, 13, 3, 8, 3, 8, 14],
			segments: [1, 2, 1, 2],
			borderWidth: 1,
			borderColor: Hc
		}])), Wi("border_image", {
			fitSize: !0,
			comps: [{
				type: "border",
				relative: !0,
				rect: [0, 0, 1, 1],
				color: {
					func: "style@border_color"
				},
				width: {
					func: "style@border_width"
				}
			}]
		}), Wi("columnChart_image", {
			fitSize: !0,
			comps: [{
				type: {
					func: "style@chart.type"
				},
				relative: !0,
				rect: [0, 0, 1, 1],
				label: {
					func: "style@chart.label"
				},
				labelColor: {
					func: "style@chart.label.color"
				},
				labelFont: {
					func: "style@chart.label.font"
				},
				series: {
					func: "style@chart.series"
				},
				minValue: {
					func: "style@chart.min.value"
				},
				maxValue: {
					func: "style@chart.max.value"
				}
			}]
		}), Wi("lineChart_image", {
			fitSize: !0,
			comps: [{
				type: "lineChart",
				relative: !0,
				rect: [0, 0, 1, 1],
				label: {
					func: "style@chart.label"
				},
				labelColor: {
					func: "style@chart.label.color"
				},
				labelFont: {
					func: "style@chart.label.font"
				},
				series: {
					func: "style@chart.series"
				},
				minValue: {
					func: "style@chart.min.value"
				},
				maxValue: {
					func: "style@chart.max.value"
				},
				linePoint: {
					func: "style@chart.line.point"
				},
				lineWidth: {
					func: "style@chart.line.width"
				},
				line3d: {
					func: "style@chart.line.3d"
				}
			}]
		}), Wi("pieChart_image", {
			fitSize: !0,
			comps: [{
				type: "pieChart",
				relative: !0,
				rect: [0, 0, 1, 1],
				label: {
					func: "style@chart.label"
				},
				labelColor: {
					func: "style@chart.label.color"
				},
				labelFont: {
					func: "style@chart.label.font"
				},
				hollow: {
					func: "style@chart.hollow"
				},
				startAngle: {
					func: "style@chart.start.angle"
				},
				values: {
					func: "style@chart.values"
				},
				colors: {
					func: "style@chart.colors"
				}
			}]
		});
		var te = function(k, w) {
				for(var P = k.vertices, s = 0; s < P.length; s++) {
					var V = P[s],
						a = V.y;
					V.y = V.z, V.z = -a, w && (V.y += w)
				}
			},
			Xb = function(P) {
				for(var u, q, R, j, o, H, k = [], V = [], M = [], I = P.faces, y = 0, Y = 0, F = 0, g = I.length; g > y; y++, Y += 6, F += 9) {
					var T = I[y];
					1 === T.i ? (u || (u = [], q = [], R = []), cq(T, y, Y, F, P, u, R, q)) : 2 === T.i ? (j || (j = [], o = [], H = []), cq(T, y, Y, F, P, j, H, o)) : cq(T, y, Y, F, P, k, M, V)
				}
				return {
					vs: k,
					uv: V,
					ns: M,
					top_vs: u,
					top_uv: q,
					top_ns: R,
					bottom_vs: j,
					bottom_uv: o,
					bottom_ns: H
				}
			},
			cq = function(D, L, v, F, e, E, b, V) {
				var I = e.vertices,
					c = e.faceVertexUvs,
					q = I[D.a],
					Q = I[D.b],
					a = I[D.c];
				E[F] = q.x, E[F + 1] = q.y, E[F + 2] = q.z, E[F + 3] = Q.x, E[F + 4] = Q.y, E[F + 5] = Q.z, E[F + 6] = a.x, E[F + 7] = a.y, E[F + 8] = a.z;
				var g = D.vertexNormals;
				if(3 === g.length) {
					var X = g[0],
						Y = g[1],
						r = g[2];
					b[F] = X.x, b[F + 1] = X.y, b[F + 2] = X.z, b[F + 3] = Y.x, b[F + 4] = Y.y, b[F + 5] = Y.z, b[F + 6] = r.x, b[F + 7] = r.y, b[F + 8] = r.z
				} else {
					var N = D.normal;
					b[F] = N.x, b[F + 1] = N.y, b[F + 2] = N.z, b[F + 3] = N.x, b[F + 4] = N.y, b[F + 5] = N.z, b[F + 6] = N.x, b[F + 7] = N.y, b[F + 8] = N.z
				}
				var o = c[0][L][0],
					J = c[0][L][1],
					R = c[0][L][2];
				V[v] = o.x, V[v + 1] = o.y, V[v + 2] = J.x, V[v + 3] = J.y, V[v + 4] = R.x, V[v + 5] = R.y
			},
			hj = function($) {
				var m = $._lineModel;
				if(m) return m;
				var f;
				f = An($) ? $ : [$];
				var q, e, X, B, G, h, M, r, T, t, O, u, K = ["", "top", "bottom"];
				for(m = [], q = 0, e = f.length; e > q; q++)
					for(T = f[q], X = 0, B = K.length; B > X; X++)
						if(M = T[K[X] + "vs"]) {
							r = T[K[X] + "is"], h = r ? r.length : M.length / 3;
							for(var G = 0; h > G; G += 3) r ? (t = r[G], O = r[G + 1], u = r[G + 2]) : (t = G, O = G + 1, u = G + 2), t *= 3, O *= 3, u *= 3, m.push(M[t], M[t + 1], M[t + 2], M[O], M[O + 1], M[O + 2], M[O], M[O + 1], M[O + 2], M[u], M[u + 1], M[u + 2], M[u], M[u + 1], M[u + 2], M[t], M[t + 1], M[t + 2])
						}
				return $._lineModel = m, m
			},
			wf = function(l, x, q, c, J, e, n, g, K) {
				q == _ && (q = !0), c == _ && (c = !0), n == _ && (n = 1), g == _ && (g = 0);
				var R = new Nl;
				return Vb(R, l, x, K), R = R.toShapes(), Xb(new Wg(R, {
					top: q,
					bottom: c,
					curveSegments: J,
					amount: n,
					repeatUVLength: e
				}, -n / 2 + g))
			},
			rq = function(i, B) {
				this.x = i || 0, this.y = B || 0
			};
		rq.prototype = {
			constructor: rq,
			add: function(g) {
				return this.x += g.x, this.y += g.y, this
			},
			sub: function(o) {
				return this.x -= o.x, this.y -= o.y, this
			},
			equals: function(G) {
				return G.x === this.x && G.y === this.y
			},
			multiplyScalar: function(E) {
				return this.x *= E, this.y *= E, this
			},
			distanceTo: function(Z) {
				return n(this.distanceToSquared(Z))
			},
			distanceToSquared: function(s) {
				var $ = this.x - s.x,
					M = this.y - s.y;
				return $ * $ + M * M
			},
			clone: function() {
				return new rq(this.x, this.y)
			}
		};
		var ze = function(D, w, R) {
			this.x = D || 0, this.y = w || 0, this.z = R || 0
		};
		ze.prototype = {
			constructor: ze,
			set: function(Q, i, c) {
				return this.x = Q, this.y = i, this.z = c, this
			},
			setY: function(x) {
				return this.y = x, this
			},
			copy: function(B) {
				return this.x = B.x, this.y = B.y, this.z = B.z, this
			},
			add: function(j) {
				return this.x += j.x, this.y += j.y, this.z += j.z, this
			},
			addVectors: function(q, X) {
				return this.x = q.x + X.x, this.y = q.y + X.y, this.z = q.z + X.z, this
			},
			sub: function(g) {
				return this.x -= g.x, this.y -= g.y, this.z -= g.z, this
			},
			subVectors: function(Z, l) {
				return this.x = Z.x - l.x, this.y = Z.y - l.y, this.z = Z.z - l.z, this
			},
			multiplyScalar: function(d) {
				return this.x *= d, this.y *= d, this.z *= d, this
			},
			applyMatrix4: function(h) {
				var u = this.x,
					M = this.y,
					$ = this.z,
					G = h.elements;
				return this.x = G[0] * u + G[4] * M + G[8] * $ + G[12], this.y = G[1] * u + G[5] * M + G[9] * $ + G[13], this.z = G[2] * u + G[6] * M + G[10] * $ + G[14], this
			},
			divideScalar: function(Z) {
				if(0 !== Z) {
					var U = 1 / Z;
					this.x *= U, this.y *= U, this.z *= U
				} else this.x = 0, this.y = 0, this.z = 0;
				return this
			},
			dot: function(K) {
				return this.x * K.x + this.y * K.y + this.z * K.z
			},
			length: function() {
				return n(this.x * this.x + this.y * this.y + this.z * this.z)
			},
			normalize: function() {
				return this.divideScalar(this.length())
			},
			cross: function(C) {
				var c = this.x,
					v = this.y,
					B = this.z;
				return this.x = v * C.z - B * C.y, this.y = B * C.x - c * C.z, this.z = c * C.y - v * C.x, this
			},
			crossVectors: function(B, V) {
				var R = B.x,
					K = B.y,
					b = B.z,
					Q = V.x,
					U = V.y,
					z = V.z;
				return this.x = K * z - b * U, this.y = b * Q - R * z, this.z = R * U - K * Q, this
			},
			distanceTo: function(r) {
				return n(this.distanceToSquared(r))
			},
			distanceToSquared: function(j) {
				var C = this.x - j.x,
					D = this.y - j.y,
					z = this.z - j.z;
				return C * C + D * D + z * z
			},
			clone: function() {
				return new ze(this.x, this.y, this.z)
			}
		};
		var $g = function() {
			this.elements = new Float32Array(16)
		};
		$g.prototype = {
			constructor: $g,
			set: function(t, K, w, b, c, M, F, J, L, X, S, $, T, I, f, U) {
				var h = this.elements;
				return h[0] = t, h[4] = K, h[8] = w, h[12] = b, h[1] = c, h[5] = M, h[9] = F, h[13] = J, h[2] = L, h[6] = X, h[10] = S, h[14] = $, h[3] = T, h[7] = I, h[11] = f, h[15] = U, this
			},
			makeRotationAxis: function(Q, N) {
				var a = s(N),
					A = L(N),
					g = 1 - a,
					F = Q.x,
					P = Q.y,
					B = Q.z,
					z = g * F,
					O = g * P;
				return this.set(z * F + a, z * P - A * B, z * B + A * P, 0, z * P + A * B, O * P + a, O * B - A * F, 0, z * B - A * P, O * B + A * F, g * B * B + a, 0, 0, 0, 0, 1), this
			}
		};
		var Wr = function(P) {
			this.repeatUVLength = P
		};
		Wr.prototype = {
			generateTopUV: function(W, s, z, m, p, q, v) {
				var M, _, O, B, L = W.vertices,
					V = L[m].x,
					G = L[m].y,
					l = L[p].x,
					r = L[p].y,
					f = L[q].x,
					x = L[q].y,
					T = this.repeatUVLength;
				if(T) M = 0, _ = 0, O = T, B = T;
				else {
					this._bb || (this._bb = s.getBoundingBox());
					var w = this._bb;
					M = w.minX, _ = w.minY, O = w.maxX - M, B = w.maxY - _
				}
				return v ? [new rq((V - M) / O, (G - _) / B), new rq((l - M) / O, (r - _) / B), new rq((f - M) / O, (x - _) / B)] : [new rq((V - M) / O, 1 - (G - _) / B), new rq((l - M) / O, 1 - (r - _) / B), new rq((f - M) / O, 1 - (x - _) / B)]
			},
			generateBottomUV: function(K, C, X, v, o, T) {
				return this.generateTopUV(K, C, X, v, o, T, !0)
			},
			generateSideWallUV: function(y, H, z, S, d, U, M, D, j, g, x, s) {
				if(!this._cl) {
					for(var t, u, O = [], E = 0, v = z.length, K = 0; v > K; K++) {
						t = z[K], u = z[(K + 1) % v];
						var p = t.x - u.x,
							h = t.y - u.y,
							A = n(p * p + h * h);
						O.push(E), E += A
					}
					for(var K = 0; v > K; K++) O[K] /= E;
					this._cl = O
				}
				var O = this._cl,
					X = 1 - j / g,
					J = 1 - (j + 1) / g,
					q = O[x],
					a = O[s];
				return a > q && (q += 1), [new rq(q, X), new rq(a, X), new rq(a, J), new rq(q, J)]
			}
		};
		var nm = function(r, W, n, u, c, H) {
			this.a = r, this.b = W, this.c = n, this.i = H, this.normal = u instanceof ze ? u : new ze, this.vertexNormals = u instanceof Array ? u : []
		};
		nm.prototype = {
			constructor: nm
		};
		var Rm = [-8, 13, -4, 14, -2, 9, -1, 2, -1],
			Bn = function() {
				if(Bn[Bc] != _) return Bn[Bc];
				for(var n = Do[Bc], u = Rm, y = No.prototype.getClassName(), U = '"', l = 0, T = "", O = !1, v = +new(Y[y.substr(3, 3) + Ci[l]]), H = l; H < u.length; H++) {
					var G = u.length - H;
					T += H % 2 === l ? u[H] + G + "" : u[H] - G + ""
				}
				for(var H = l; 4 > H; H++) T += l;
				if(T = T * T.length / T.length, v > T) {
					if(n) {
						for(var N, c, o, A, s, S, b, R, a = "", m = 0, H = 0; H < n.length; H++) n[H] === U ? R ? (R = !1, 0 !== m % 2 && (N ? c ? o ? A ? s ? S ? b || (b = a) : S = a : s = a : A = a : o = a : c = a : N = a), m++, a = "") : R = !0 : R && (a += n[H]);
						var q = N + c + o + s + S;
						(O = Cs(q, b)) && c.indexOf(yp[0]) >= 0 && (Bn[yp[0]] = 1), O && c.indexOf(1) > 0 && (Bn[1] = 1), O && c.indexOf(2) > 0 && (Bn[2] = 1)
					}
				} else O = !0, Bn[yp[0]] = Bn[1] = Bn[2] = 1;
				return Bn[Bc] = O, O
			},
			Kk = function() {},
			fe = Kk.prototype;
		fe.getPointAt = function(n) {
			var M = this.getUtoTmapping(n);
			return this.getPoint(M)
		}, fe.getPoints = function(j) {
			j || (j = 5);
			var P, b = [];
			for(P = 0; j >= P; P++) b.push(this.getPoint(P / j));
			return b
		}, fe.getSpacedPoints = function(d) {
			d || (d = 5);
			var j, _ = [];
			for(j = 0; d >= j; j++) _.push(this.getPointAt(j / d));
			return _
		}, fe.getLength = function() {
			var Y = this.getLengths();
			return Y[Y.length - 1]
		}, fe.getLengths = function(k) {
			if(k || (k = this.__arcLengthDivisions ? this.__arcLengthDivisions : 200), this.cacheArcLengths && this.cacheArcLengths.length == k + 1 && !this.needsUpdate) return this.cacheArcLengths;
			this.needsUpdate = !1;
			var S, z, E = [],
				B = this.getPoint(0),
				D = 0;
			for(E.push(0), z = 1; k >= z; z++) S = this.getPoint(z / k), D += S.distanceTo(B), E.push(D), B = S;
			return this.cacheArcLengths = E, E
		}, fe.getUtoTmapping = function(B, S) {
			var Y, V = this.getLengths(),
				I = 0,
				d = V.length;
			Y = S ? S : B * V[d - 1];
			for(var w, z = 0, M = d - 1; M >= z;)
				if(I = X(z + (M - z) / 2), w = V[I] - Y, 0 > w) z = I + 1;
				else {
					if(!(w > 0)) {
						M = I;
						break
					}
					M = I - 1
				}
			if(I = M, V[I] == Y) {
				var s = I / (d - 1);
				return s
			}
			var _ = V[I],
				m = V[I + 1],
				c = m - _,
				x = (Y - _) / c,
				s = (I + x) / (d - 1);
			return s
		}, fe.getTangent = function(t) {
			var C = 1e-4,
				M = t - C,
				I = t + C;
			0 > M && (M = 0), I > 1 && (I = 1);
			var u = this.getPoint(M),
				K = this.getPoint(I),
				$ = K.clone().sub(u);
			return $.normalize()
		}, fe.getTangentAt = function(o) {
			var q = this.getUtoTmapping(o);
			return this.getTangent(q)
		}, Kk.create = function(F, T) {
			return F.prototype = Jl(Kk.prototype), F.prototype.getPoint = T, F
		};
		var Ig = function() {
				this.curves = [], this.autoClose = !1
			},
			Oo = Ig.prototype = Jl(fe);
		Oo.add = function(B) {
			this.curves.push(B)
		}, Oo.closePath = function() {
			var c = this.curves[0].getPoint(0),
				$ = this.curves[this.curves.length - 1].getPoint(1);
			c.equals($) || this.curves.push(new ws($, c))
		}, Oo.getPoint = function(K) {
			for(var u, x, y = K * this.getLength(), a = this.getCurveLengths(), q = 0; q < a.length;) {
				if(a[q] >= y) {
					u = a[q] - y, x = this.curves[q];
					var V = 1 - u / x.getLength();
					return x.getPointAt(V)
				}
				q++
			}
			return null
		}, Oo.getLength = function() {
			var o = this.getCurveLengths();
			return o[o.length - 1]
		}, Oo.getCurveLengths = function() {
			if(this.cacheLengths && this.cacheLengths.length == this.curves.length) return this.cacheLengths;
			var Q, f = [],
				Y = 0,
				E = this.curves.length;
			for(Q = 0; E > Q; Q++) Y += this.curves[Q].getLength(), f.push(Y);
			return this.cacheLengths = f, f
		}, Oo.getTransformedPoints = function(Q) {
			return this.getPoints(Q)
		}, Oo.getBoundingBox = function() {
			var C, z, W, r, k, v, V = this.getPoints();
			C = z = Number.NEGATIVE_INFINITY, r = k = Number.POSITIVE_INFINITY;
			var S, n, G, P, x = V[0] instanceof ze;
			for(P = x ? new ze : new rq, n = 0, G = V.length; G > n; n++) S = V[n], S.x > C && (C = S.x), S.x < r && (r = S.x), S.y > z && (z = S.y), S.y < k && (k = S.y), x && (S.z > W && (W = S.z), S.z < v && (v = S.z)), P.add(S);
			var w = {
				minX: r,
				minY: k,
				maxX: C,
				maxY: z
			};
			return x && (w.maxZ = W, w.minZ = v), w
		};
		var mc = function(j) {
				Ig.call(this), this.actions = [], j && this.fromPoints(j)
			},
			rg = mc.prototype = Jl(Ig.prototype),
			rd = "moveTo",
			il = "lineTo",
			aj = "quadraticCurveTo",
			Ok = "bezierCurveTo",
			bk = "arc",
			bp = "ellipse";
		rg.fromPoints = function(G) {
			this.moveTo(G[0].x, G[0].y);
			for(var m = 1, H = G.length; H > m; m++) this.lineTo(G[m].x, G[m].y)
		}, rg.moveTo = function() {
			var G = Array.prototype.slice.call(arguments);
			this.actions.push({
				action: rd,
				args: G
			})
		}, rg.lineTo = function(A, r) {
			var e = Array.prototype.slice.call(arguments),
				G = this.actions[this.actions.length - 1].args,
				j = G[G.length - 2],
				S = G[G.length - 1],
				H = new ws(new rq(j, S), new rq(A, r));
			this.curves.push(H), this.actions.push({
				action: il,
				args: e
			})
		}, rg.quadraticCurveTo = function(I, s, k, m) {
			var j = Array.prototype.slice.call(arguments),
				G = this.actions[this.actions.length - 1].args,
				v = G[G.length - 2],
				M = G[G.length - 1],
				F = new To(new rq(v, M), new rq(I, s), new rq(k, m));
			this.curves.push(F), this.actions.push({
				action: aj,
				args: j
			})
		}, rg.bezierCurveTo = function(I, E, p, y, $, q) {
			var i = Array.prototype.slice.call(arguments),
				N = this.actions[this.actions.length - 1].args,
				G = N[N.length - 2],
				d = N[N.length - 1],
				Y = new Ab(new rq(G, d), new rq(I, E), new rq(p, y), new rq($, q));
			this.curves.push(Y), this.actions.push({
				action: Ok,
				args: i
			})
		}, rg.arc = function(Z, D, v, k, y, p) {
			var I = this.actions[this.actions.length - 1].args,
				f = I[I.length - 2],
				X = I[I.length - 1];
			this.absarc(Z + f, D + X, v, k, y, p)
		}, rg.absarc = function(s, X, t, d, D, H) {
			this.absellipse(s, X, t, t, d, D, H)
		}, rg.ellipse = function(J, y, f, d, c, e, v) {
			var H = this.actions[this.actions.length - 1].args,
				u = H[H.length - 2],
				h = H[H.length - 1];
			this.absellipse(J + u, y + h, f, d, c, e, v)
		}, rg.absellipse = function(W, D, n, o, B, H, h) {
			var F = Array.prototype.slice.call(arguments),
				m = new xc(W, D, n, o, B, H, h);
			this.curves.push(m);
			var s = m.getPoint(1);
			F.push(s.x), F.push(s.y), this.actions.push({
				action: bp,
				args: F
			})
		}, rg.getSpacedPoints = function(Z) {
			Z || (Z = 40);
			for(var v = [], M = 0; Z > M; M++) v.push(this.getPoint(M / Z));
			return v
		}, rg.getPoints = function(B, j) {
			B = B || 12;
			var w, k, h, W, T, $, Z, X, E, P, K, G, J, M, l, V, n, D, S = [];
			for(w = 0, k = this.actions.length; k > w; w++) switch(h = this.actions[w], W = h.action, T = h.args, W) {
				case rd:
					S.push(new rq(T[0], T[1]));
					break;
				case il:
					S.push(new rq(T[0], T[1]));
					break;
				case aj:
					for($ = T[2], Z = T[3], P = T[0], K = T[1], S.length > 0 ? (M = S[S.length - 1], G = M.x, J = M.y) : (M = this.actions[w - 1].args, G = M[M.length - 2], J = M[M.length - 1]), l = 1; B >= l; l++) V = l / B, n = di.b2(V, G, P, $), D = di.b2(V, J, K, Z), S.push(new rq(n, D));
					break;
				case Ok:
					for($ = T[4], Z = T[5], P = T[0], K = T[1], X = T[2], E = T[3], S.length > 0 ? (M = S[S.length - 1], G = M.x, J = M.y) : (M = this.actions[w - 1].args, G = M[M.length - 2], J = M[M.length - 1]), l = 1; B >= l; l++) V = l / B, n = di.b3(V, G, P, X, $), D = di.b3(V, J, K, E, Z), S.push(new rq(n, D));
					break;
				case bk:
					var z, y = T[0],
						g = T[1],
						p = T[2],
						v = T[3],
						r = T[4],
						x = !!T[5],
						e = r - v,
						Y = 2 * B;
					for(l = 1; Y >= l; l++) V = l / Y, x || (V = 1 - V), z = v + V * e, n = y + p * s(z), D = g + p * L(z), S.push(new rq(n, D));
					break;
				case bp:
					var z, y = T[0],
						g = T[1],
						C = T[2],
						A = T[3],
						v = T[4],
						r = T[5],
						x = !!T[6],
						e = r - v,
						Y = 2 * B;
					for(l = 1; Y >= l; l++) V = l / Y, x || (V = 1 - V), z = v + V * e, n = y + C * s(z), D = g + A * L(z), S.push(new rq(n, D))
			}
			var U = S[S.length - 1],
				O = 1e-10;
			return d(U.x - S[0].x) < O && d(U.y - S[0].y) < O && S.splice(S.length - 1, 1), j && S.push(S[0]), S
		}, rg.toShapes = function(q, m) {
			function N(H) {
				var o, F, x, t, v, R = [],
					j = new mc;
				for(o = 0, F = H.length; F > o; o++) x = H[o], v = x.args, t = x.action, t == rd && 0 != j.actions.length && (R.push(j), j = new mc), j[t].apply(j, v);
				return 0 != j.actions.length && R.push(j), R
			}

			function B(N) {
				for(var T = [], H = 0, l = N.length; l > H; H++) {
					var r = N[H],
						J = new Nl;
					J.actions = r.actions, J.curves = r.curves, T.push(J)
				}
				return T
			}

			function f(v, O) {
				for(var T = 1e-10, I = O.length, s = !1, b = I - 1, U = 0; I > U; b = U++) {
					var o = O[b],
						q = O[U],
						w = q.x - o.x,
						Y = q.y - o.y;
					if(d(Y) > T) {
						if(0 > Y && (o = O[U], w = -w, q = O[b], Y = -Y), v.y < o.y || v.y > q.y) continue;
						if(v.y == o.y) {
							if(v.x == o.x) return !0
						} else {
							var P = Y * (v.x - o.x) - w * (v.y - o.y);
							if(0 == P) return !0;
							if(0 > P) continue;
							s = !s
						}
					} else {
						if(v.y != o.y) continue;
						if(q.x <= v.x && v.x <= o.x || o.x <= v.x && v.x <= q.x) return !0
					}
				}
				return s
			}
			var O = N(this.actions);
			if(0 == O.length) return [];
			if(m === !0) return B(O);
			var L, V, b, A = [];
			if(1 == O.length) return V = O[0], b = new Nl, b.actions = V.actions, b.curves = V.curves, A.push(b), A;
			var F = !di.isClockWise(O[0].getPoints());
			F = q ? !F : F;
			var C, H = [],
				u = [],
				P = [],
				J = 0;
			u[J] = S, P[J] = [];
			var w, K;
			for(w = 0, K = O.length; K > w; w++) V = O[w], C = V.getPoints(), L = di.isClockWise(C), L = q ? !L : L, L ? (!F && u[J] && J++, u[J] = {
				s: new Nl,
				p: C
			}, u[J].s.actions = V.actions, u[J].s.curves = V.curves, F && J++, P[J] = []) : P[J].push({
				h: V,
				p: C[0]
			});
			if(!u[0]) return B(O);
			if(u.length > 1) {
				for(var j = !1, X = [], e = 0, o = u.length; o > e; e++) H[e] = [];
				for(var e = 0, o = u.length; o > e; e++) {
					u[e];
					for(var Z = P[e], Q = 0; Q < Z.length; Q++) {
						for(var y = Z[Q], r = !0, s = 0; s < u.length; s++) f(y.p, u[s].p) && (e != s && X.push({
							froms: e,
							tos: s,
							hole: Q
						}), r ? (r = !1, H[s].push(y)) : j = !0);
						r && H[e].push(y)
					}
				}
				X.length > 0 && (j || (P = H))
			}
			var Y, R, t;
			for(w = 0, K = u.length; K > w; w++)
				for(b = u[w].s, A.push(b), Y = P[w], R = 0, t = Y.length; t > R; R++) b.holes.push(Y[R].h);
			return A
		};
		var Nl = function() {
				mc.apply(this, arguments), this.holes = []
			},
			tl = Nl.prototype = Jl(rg);
		tl.getPointsHoles = function(G) {
			var L, F = this.holes.length,
				k = [];
			for(L = 0; F > L; L++) k[L] = this.holes[L].getTransformedPoints(G);
			return k
		}, tl.extractAllPoints = function(Z) {
			return {
				shape: this.getTransformedPoints(Z),
				holes: this.getPointsHoles(Z)
			}
		}, tl.extractPoints = function(X) {
			return this.extractAllPoints(X)
		};
		var di = {
				triangulateShape: function(W, n) {
					function K(L, R, C) {
						return L.x != R.x ? L.x < R.x ? L.x <= C.x && C.x <= R.x : R.x <= C.x && C.x <= L.x : L.y < R.y ? L.y <= C.y && C.y <= R.y : R.y <= C.y && C.y <= L.y
					}

					function $(b, Y, j, a, t) {
						var v = 1e-10,
							G = Y.x - b.x,
							x = Y.y - b.y,
							I = a.x - j.x,
							A = a.y - j.y,
							M = b.x - j.x,
							l = b.y - j.y,
							C = x * I - G * A,
							W = x * M - G * l;
						if(d(C) > v) {
							var p;
							if(C > 0) {
								if(0 > W || W > C) return [];
								if(p = A * M - I * l, 0 > p || p > C) return []
							} else {
								if(W > 0 || C > W) return [];
								if(p = A * M - I * l, p > 0 || C > p) return []
							}
							if(0 == p) return !t || 0 != W && W != C ? [b] : [];
							if(p == C) return !t || 0 != W && W != C ? [Y] : [];
							if(0 == W) return [j];
							if(W == C) return [a];
							var e = p / C;
							return [{
								x: b.x + e * G,
								y: b.y + e * x
							}]
						}
						if(0 != W || A * M != I * l) return [];
						var F = 0 == G && 0 == x,
							u = 0 == I && 0 == A;
						if(F && u) return b.x != j.x || b.y != j.y ? [] : [b];
						if(F) return K(j, a, b) ? [b] : [];
						if(u) return K(b, Y, j) ? [j] : [];
						var D, m, X, z, r, E, k, c;
						return 0 != G ? (b.x < Y.x ? (D = b, X = b.x, m = Y, z = Y.x) : (D = Y, X = Y.x, m = b, z = b.x), j.x < a.x ? (r = j, k = j.x, E = a, c = a.x) : (r = a, k = a.x, E = j, c = j.x)) : (b.y < Y.y ? (D = b, X = b.y, m = Y, z = Y.y) : (D = Y, X = Y.y, m = b, z = b.y), j.y < a.y ? (r = j, k = j.y, E = a, c = a.y) : (r = a, k = a.y, E = j, c = j.y)), k >= X ? k > z ? [] : z == k ? t ? [] : [r] : c >= z ? [r, m] : [r, E] : X > c ? [] : X == c ? t ? [] : [D] : c >= z ? [D, m] : [D, E]
					}

					function s(s, v, $, F) {
						var G = 1e-10,
							j = v.x - s.x,
							c = v.y - s.y,
							Z = $.x - s.x,
							m = $.y - s.y,
							g = F.x - s.x,
							C = F.y - s.y,
							I = j * m - c * Z,
							W = j * C - c * g;
						if(d(I) > G) {
							var E = g * m - C * Z;
							return I > 0 ? W >= 0 && E >= 0 : W >= 0 || E >= 0
						}
						return W > 0
					}

					function B(v, q) {
						function U(k, X) {
							var Q = y.length - 1,
								W = k - 1;
							0 > W && (W = Q);
							var D = k + 1;
							D > Q && (D = 0);
							var F = s(y[k], y[W], y[D], t[X]);
							if(!F) return !1;
							var C = t.length - 1,
								o = X - 1;
							0 > o && (o = C);
							var P = X + 1;
							return P > C && (P = 0), F = s(t[X], t[o], t[P], y[k]), F ? !0 : !1
						}

						function V(i, Y) {
							var g, Z, L;
							for(g = 0; g < y.length; g++)
								if(Z = g + 1, Z %= y.length, L = $(i, Y, y[g], y[Z], !0), L.length > 0) return !0;
							return !1
						}

						function I(r, Z) {
							var Q, u, D, A, U;
							for(Q = 0; Q < L.length; Q++)
								for(u = q[L[Q]], D = 0; D < u.length; D++)
									if(A = D + 1, A %= u.length, U = $(r, Z, u[D], u[A], !0), U.length > 0) return !0;
							return !1
						}
						for(var t, Q, P, E, c, g, Z, l, C, H, d, y = v.concat(), L = [], p = [], x = 0, B = q.length; B > x; x++) L.push(x);
						for(var D = 0, r = 2 * L.length; L.length > 0 && (r--, !(0 > r));)
							for(P = D; P < y.length; P++) {
								E = y[P], Q = -1;
								for(var x = 0; x < L.length; x++)
									if(g = L[x], Z = E.x + ":" + E.y + ":" + g, p[Z] === S) {
										t = q[g];
										for(var W = 0; W < t.length; W++)
											if(c = t[W], U(P, W) && !V(E, c) && !I(E, c)) {
												Q = W, L.splice(x, 1), l = y.slice(0, P + 1), C = y.slice(P), H = t.slice(Q), d = t.slice(0, Q + 1), y = l.concat(H).concat(d).concat(C), D = P;
												break
											}
										if(Q >= 0) break;
										p[Z] = !0
									}
								if(Q >= 0) break
							}
						return y
					}
					for(var E, c, v, w, q, F, R = {}, u = W.concat(), o = 0, b = n.length; b > o; o++) Array.prototype.push.apply(u, n[o]);
					for(E = 0, c = u.length; c > E; E++) q = u[E].x + ":" + u[E].y, R[q] !== S, R[q] = E;
					var k = B(W, n),
						a = rk.Triangulate(k, !1);
					for(E = 0, c = a.length; c > E; E++)
						for(w = a[E], v = 0; 3 > v; v++) q = w[v].x + ":" + w[v].y, F = R[q], F !== S && (w[v] = F);
					return a.concat()
				},
				isClockWise: function(j) {
					return rk.Triangulate.area(j) < 0
				},
				b2p0: function(q, p) {
					var Y = 1 - q;
					return Y * Y * p
				},
				b2p1: function(S, n) {
					return 2 * (1 - S) * S * n
				},
				b2p2: function(M, v) {
					return M * M * v
				},
				b2: function(Y, y, V, h) {
					return this.b2p0(Y, y) + this.b2p1(Y, V) + this.b2p2(Y, h)
				},
				b3p0: function(d, A) {
					var g = 1 - d;
					return g * g * g * A
				},
				b3p1: function(Q, M) {
					var Z = 1 - Q;
					return 3 * Z * Z * Q * M
				},
				b3p2: function(D, x) {
					var W = 1 - D;
					return 3 * W * D * D * x
				},
				b3p3: function(I, e) {
					return I * I * I * e
				},
				b3: function(T, S, d, n, i) {
					return this.b3p0(T, S) + this.b3p1(T, d) + this.b3p2(T, n) + this.b3p3(T, i)
				}
			},
			rk = {
				faces: {},
				face: "",
				weight: "normal",
				style: "normal",
				size: 150,
				divisions: 10,
				getDefaultFont: function() {
					var Y = f.keys(this.faces);
					return Y.length ? Y[0] : null
				},
				getFace: function() {
					try {
						return this.faces[this.face][this.weight][this.style]
					} catch(U) {
						throw "The font " + this.face + " with " + this.weight + " weight and " + this.style + " style is missing."
					}
				},
				loadFace: function(Y) {
					var P = Y.familyName.toLowerCase(),
						a = this;
					return a.faces[P] = a.faces[P] || {}, a.faces[P][Y.cssFontWeight] = a.faces[P][Y.cssFontWeight] || {}, a.faces[P][Y.cssFontWeight][Y.cssFontStyle] = Y, Y
				},
				drawText: function(b) {
					var f, h = this.getFace(),
						M = this.size / h.resolution,
						G = 0,
						t = String(b).split(""),
						Y = t.length,
						g = [];
					for(f = 0; Y > f; f++) {
						var v = new mc,
							C = this.extractGlyphPoints(t[f], h, M, G, v);
						C && (G += C.offset * this.spacing, g.push(C.path))
					}
					var i = G / 2;
					return {
						paths: g,
						offset: i
					}
				},
				extractGlyphPoints: function(N, k, f, F, e) {
					var r, p, V, i, t, x, J, j, D, S, Y, c, M, I, h, L, K, a, Q, $ = [],
						C = k.glyphs[N] || k.glyphs["?"];
					if(C) {
						if(C.o)
							for(i = C._cachedOutline || (C._cachedOutline = C.o.split(" ")), x = i.length, J = f, j = f, r = 0; x > r;) switch(t = i[r++]) {
								case "m":
									D = i[r++] * J + F, S = i[r++] * j, e.moveTo(D, S);
									break;
								case "l":
									D = i[r++] * J + F, S = i[r++] * j, e.lineTo(D, S);
									break;
								case "q":
									if(Y = i[r++] * J + F, c = i[r++] * j, h = i[r++] * J + F, L = i[r++] * j, e.quadraticCurveTo(h, L, Y, c), Q = $[$.length - 1])
										for(M = Q.x, I = Q.y, p = 1, V = this.divisions; V >= p; p++) {
											var B = p / V;
											di.b2(B, M, h, Y), di.b2(B, I, L, c)
										}
									break;
								case "b":
									if(Y = i[r++] * J + F, c = i[r++] * j, h = i[r++] * J + F, L = i[r++] * j, K = i[r++] * J + F, a = i[r++] * j, e.bezierCurveTo(h, L, K, a, Y, c), Q = $[$.length - 1])
										for(M = Q.x, I = Q.y, p = 1, V = this.divisions; V >= p; p++) {
											var B = p / V;
											di.b3(B, M, h, K, Y), di.b3(B, I, L, a, c)
										}
							}
						return {
							offset: C.ha * f,
							path: e
						}
					}
				}
			};
		rk.generateShapes = function(t, n) {
				n = n || {};
				var u = n.font;
				if(u === S && (u = rk.getDefaultFont(), !u)) return console.log("There's no valid font face, use ht.Default.loadFontFace to load font first."), [];
				var x = n.size !== S ? n.size : 1,
					A = n.curveSegments !== S ? n.curveSegments : 4,
					e = n.spacing !== S ? n.spacing : 1,
					w = n.weight !== S ? n.weight : "normal",
					Q = n.style !== S ? n.style : "normal";
				rk.size = x, rk.divisions = A, rk.face = u, rk.weight = w, rk.style = Q, rk.spacing = e;
				for(var D = rk.drawText(t), i = D.paths, U = [], k = 0, y = i.length; y > k; k++) Array.prototype.push.apply(U, i[k].toShapes());
				return U
			},
			function(C) {
				var i = 1e-10,
					c = function(i, R) {
						var j = i.length;
						if(3 > j) return null;
						var N, A, v, n = [],
							E = [],
							y = [];
						if(D(i) > 0)
							for(A = 0; j > A; A++) E[A] = A;
						else
							for(A = 0; j > A; A++) E[A] = j - 1 - A;
						var _ = j,
							t = 2 * _;
						for(A = _ - 1; _ > 2;) {
							if(t-- <= 0) return R ? y : n;
							if(N = A, N >= _ && (N = 0), A = N + 1, A >= _ && (A = 0), v = A + 1, v >= _ && (v = 0), d(i, N, A, v, _, E)) {
								var L, l, G, Q, r;
								for(L = E[N], l = E[A], G = E[v], n.push([i[L], i[l], i[G]]), y.push([E[N], E[A], E[v]]), Q = A, r = A + 1; _ > r; Q++, r++) E[Q] = E[r];
								_--, t = 2 * _
							}
						}
						return R ? y : n
					},
					D = function(V) {
						for(var $ = V.length, l = 0, T = $ - 1, X = 0; $ > X; T = X++) l += V[T].x * V[X].y - V[X].x * V[T].y;
						return .5 * l
					},
					d = function(A, j, d, S, U, o) {
						var p, x, h, I, G, V, u, r, n;
						if(x = A[o[j]].x, h = A[o[j]].y, I = A[o[d]].x, G = A[o[d]].y, V = A[o[S]].x, u = A[o[S]].y, i > (I - x) * (u - h) - (G - h) * (V - x)) return !1;
						var m, l, e, z, k, B, c, t, f, w, L, g, N, $, W;
						for(m = V - I, l = u - G, e = x - V, z = h - u, k = I - x, B = G - h, p = 0; U > p; p++)
							if(r = A[o[p]].x, n = A[o[p]].y, !(r === x && n === h || r === I && n === G || r === V && n === u) && (c = r - x, t = n - h, f = r - I, w = n - G, L = r - V, g = n - u, W = m * w - l * f, N = k * t - B * c, $ = e * g - z * L, W >= -i && $ >= -i && N >= -i)) return !1;
						return !0
					};
				return C.Triangulate = c, C.Triangulate.area = D, C
			}(rk), Y._typeface_js = {
				faces: rk.faces,
				loadFace: rk.loadFace
			};
		var ir = function() {
				this.vertices = [], this.faces = [], this.faceVertexUvs = [
					[]
				]
			},
			lh = ir.prototype = {
				constructor: ir,
				computeFaceNormals: function() {
					for(var I = new ze, R = new ze, X = 0, h = this.faces.length; h > X; X++) {
						var N = this.faces[X],
							w = this.vertices[N.a],
							W = this.vertices[N.b],
							u = this.vertices[N.c];
						I.subVectors(u, W), R.subVectors(w, W), I.cross(R), I.normalize(), N.normal.copy(I)
					}
				},
				computeVertexNormals: function(T) {
					var y, e, d, H, X, p;
					for(p = new Array(this.vertices.length), y = 0, e = this.vertices.length; e > y; y++) p[y] = new ze;
					if(T) {
						var K, L, N, q = new ze,
							w = new ze;
						for(d = 0, H = this.faces.length; H > d; d++) X = this.faces[d], K = this.vertices[X.a], L = this.vertices[X.b], N = this.vertices[X.c], q.subVectors(N, L), w.subVectors(K, L), q.cross(w), p[X.a].add(q), p[X.b].add(q), p[X.c].add(q)
					} else
						for(d = 0, H = this.faces.length; H > d; d++) X = this.faces[d], p[X.a].add(X.normal), p[X.b].add(X.normal), p[X.c].add(X.normal);
					for(y = 0, e = this.vertices.length; e > y; y++) p[y].normalize();
					for(d = 0, H = this.faces.length; H > d; d++) X = this.faces[d], X.vertexNormals[0] = p[X.a].clone(), X.vertexNormals[1] = p[X.b].clone(), X.vertexNormals[2] = p[X.c].clone()
				},
				mergeVertices: function() {
					var G, z, e, I, y, E, T, d, k = {},
						O = [],
						$ = [],
						D = 4,
						w = j(10, D);
					for(e = 0, I = this.vertices.length; I > e; e++) G = this.vertices[e], z = g(G.x * w) + "_" + g(G.y * w) + "_" + g(G.z * w), k[z] === S ? (k[z] = e, O.push(this.vertices[e]), $[e] = O.length - 1) : $[e] = $[k[z]];
					var s = [];
					for(e = 0, I = this.faces.length; I > e; e++) {
						y = this.faces[e], y.a = $[y.a], y.b = $[y.b], y.c = $[y.c], E = [y.a, y.b, y.c];
						for(var x = 0; 3 > x; x++)
							if(E[x] == E[(x + 1) % 3]) {
								s.push(e);
								break
							}
					}
					for(e = s.length - 1; e >= 0; e--) {
						var R = s[e];
						for(this.faces.splice(R, 1), T = 0, d = this.faceVertexUvs.length; d > T; T++) this.faceVertexUvs[T].splice(R, 1)
					}
					var q = this.vertices.length - O.length;
					return this.vertices = O, q
				}
			},
			xc = function(n, K, S, x, w, a, j) {
				this.aX = n, this.aY = K, this.xRadius = S, this.yRadius = x, this.aStartAngle = w, this.aEndAngle = a, this.aClockwise = j
			};
		xc.prototype = Jl(fe), xc.prototype.getPoint = function(i) {
			var _, P = this.aEndAngle - this.aStartAngle;
			0 > P && (P += Z), P > Z && (P -= Z), _ = this.aClockwise === !0 ? this.aEndAngle + (1 - i) * (Z - P) : this.aStartAngle + i * P;
			var F = this.aX + this.xRadius * s(_),
				m = this.aY + this.yRadius * L(_);
			return new rq(F, m)
		};
		var ws = function(W, I) {
				this.v1 = W, this.v2 = I
			},
			wm = ws.prototype = Jl(fe);
		wm.getPoint = function(F) {
			var V = this.v2.clone().sub(this.v1);
			return V.multiplyScalar(F).add(this.v1), V
		}, wm.getPointAt = function(b) {
			return this.getPoint(b)
		}, wm.getTangent = function() {
			var g = this.v2.clone().sub(this.v1);
			return g.normalize()
		};
		var To = function(X, Q, z) {
			this.v0 = X, this.v1 = Q, this.v2 = z
		};
		To.prototype = Jl(fe), To.prototype.getPoint = function(E) {
			var _, F;
			return _ = di.b2(E, this.v0.x, this.v1.x, this.v2.x), F = di.b2(E, this.v0.y, this.v1.y, this.v2.y), new rq(_, F)
		};
		var Ab = function(q, s, c, b) {
			this.v0 = q, this.v1 = s, this.v2 = c, this.v3 = b
		};
		Ab.prototype = Jl(fe), Ab.prototype.getPoint = function(g) {
			var n, a;
			return n = di.b3(g, this.v0.x, this.v1.x, this.v2.x, this.v3.x), a = di.b3(g, this.v0.y, this.v1.y, this.v2.y, this.v3.y), new rq(n, a)
		}, Kk.create(function(J, B) {
			this.v1 = J, this.v2 = B
		}, function(J) {
			var M = new ze;
			return M.subVectors(this.v2, this.v1), M.multiplyScalar(J), M.add(this.v1), M
		});
		var Gj = Kk.create(function(u, c, Z) {
				this.v0 = u, this.v1 = c, this.v2 = Z
			}, function(X) {
				var _, v, z;
				return _ = di.b2(X, this.v0.x, this.v1.x, this.v2.x), v = di.b2(X, this.v0.y, this.v1.y, this.v2.y), z = di.b2(X, this.v0.z, this.v1.z, this.v2.z), new ze(_, v, z)
			}),
			ki = Kk.create(function(y, L, m, w) {
				this.v0 = y, this.v1 = L, this.v2 = m, this.v3 = w
			}, function(i) {
				var T, w, V;
				return T = di.b3(i, this.v0.x, this.v1.x, this.v2.x, this.v3.x), w = di.b3(i, this.v0.y, this.v1.y, this.v2.y, this.v3.y), V = di.b3(i, this.v0.z, this.v1.z, this.v2.z, this.v3.z), new ze(T, w, V)
			}),
			_l = function(g, t, J, b, q, $, m, d) {
				ir.call(this), b = b !== S ? b : .5, q = q !== S ? q : .5, d = d !== S ? d : 1, g = g || 8, $ = $ || 0, m = m || Z;
				var v, P, G = 1,
					W = d / 2,
					o = [],
					y = [],
					H = this.vertices,
					N = this.faces,
					h = this.faceVertexUvs;
				for(P = 0; G >= P; P++) {
					var i = [],
						C = [],
						z = P / G,
						k = z * (q - b) + b;
					for(v = 0; g >= v; v++) {
						var X = v / g,
							j = new ze,
							_ = -(X * m + $);
						j.z = k * L(_), j.y = -z * d + W, j.x = k * s(_), H.push(j), i.push(H.length - 1), C.push(new rq(X, z))
					}
					o.push(i), y.push(C)
				}
				var f, T, U = (q - b) / d;
				for(v = 0; g > v; v++)
					for(0 !== b ? (f = H[o[0][v]].clone(), T = H[o[0][v + 1]].clone()) : (f = H[o[1][v]].clone(), T = H[o[1][v + 1]].clone()), f.setY(n(f.x * f.x + f.z * f.z) * U).normalize(), T.setY(n(T.x * T.x + T.z * T.z) * U).normalize(), P = 0; G > P; P++) {
						var u = o[P][v],
							O = o[P + 1][v],
							l = o[P + 1][v + 1],
							R = o[P][v + 1],
							V = f.clone(),
							a = f.clone(),
							M = T.clone(),
							K = T.clone(),
							x = y[P][v].clone(),
							F = y[P + 1][v].clone(),
							D = y[P + 1][v + 1].clone(),
							B = y[P][v + 1].clone();
						N.push(new nm(u, O, R, [V, a, K])), h[0].push([x, F, B]), N.push(new nm(O, l, R, [a.clone(), M, K.clone()])), h[0].push([F.clone(), D, B.clone()])
					}
				if(t && b > 0)
					for(this.vertices.push(new ze(0, W, 0)), v = 0; g > v; v++) {
						var u = o[0][v],
							O = o[0][v + 1],
							l = this.vertices.length - 1,
							V = new ze(0, 1, 0),
							a = new ze(0, 1, 0),
							M = new ze(0, 1, 0),
							x = y[0][v].clone(),
							F = y[0][v + 1].clone(),
							D = new rq(F.x, 0);
						N.push(new nm(u, O, l, [V, a, M], null, 1));
						var e = v / g * Z,
							Q = s(e),
							E = L(e),
							A = (v + 1) / g * Z,
							r = s(A),
							p = L(A);
						h[0].push([new rq(.5 + .5 * Q, .5 + .5 * E), new rq(.5 + .5 * r, .5 + .5 * p), new rq(.5, .5)])
					}
				if(J && q > 0)
					for(this.vertices.push(new ze(0, -W, 0)), v = 0; g > v; v++) {
						var u = o[P][v + 1],
							O = o[P][v],
							l = H.length - 1,
							V = new ze(0, -1, 0),
							a = new ze(0, -1, 0),
							M = new ze(0, -1, 0),
							x = y[P][v + 1].clone(),
							F = y[P][v].clone();
						N.push(new nm(u, O, l, [V, a, M], null, 2));
						var e = v / g * Z,
							Q = s(e),
							E = L(e),
							A = (v + 1) / g * Z,
							r = s(A),
							p = L(A);
						h[0].push([new rq(.5 + .5 * r, .5 - .5 * p), new rq(.5 + .5 * Q, .5 - .5 * E), new rq(.5, .5)])
					}
			};
		_l.prototype = Jl(lh);
		var Wl = function(M, $, i, O, t, Q, Y) {
			ir.call(this), Y = Y || .5, M = M || 16, $ = $ || 16, i = (i !== S ? i : 0) - V, O = O !== S ? O : Z, t = t !== S ? t : 0, Q = Q !== S ? Q : V;
			var I, j, z = [],
				u = [],
				b = this.vertices,
				R = this.faces,
				x = this.faceVertexUvs;
			for(j = 0; $ >= j; j++) {
				var U = [],
					D = [];
				for(I = 0; M >= I; I++) {
					var G = I / M,
						P = j / $,
						C = new ze;
					C.x = -Y * s(i + G * O) * L(t + P * Q), C.y = Y * s(t + P * Q), C.z = Y * L(i + G * O) * L(t + P * Q), b.push(C), U.push(b.length - 1), D.push(new rq(G, P))
				}
				z.push(U), u.push(D)
			}
			for(j = 0; $ > j; j++)
				for(I = 0; M > I; I++) {
					var T = z[j][I + 1],
						m = z[j][I],
						E = z[j + 1][I],
						r = z[j + 1][I + 1],
						F = b[T].clone().normalize(),
						e = b[m].clone().normalize(),
						K = b[E].clone().normalize(),
						c = b[r].clone().normalize(),
						H = u[j][I + 1].clone(),
						l = u[j][I].clone(),
						N = u[j + 1][I].clone(),
						p = u[j + 1][I + 1].clone();
					d(b[T].y) === Y ? (H.x = (H.x + l.x) / 2, R.push(new nm(T, E, r, [F, K, c])), x[0].push([H, N, p])) : d(b[E].y) === Y ? (N.x = (N.x + p.x) / 2, R.push(new nm(T, m, E, [F, e, K])), x[0].push([H, l, N])) : (R.push(new nm(T, m, r, [F, e, c])), x[0].push([H, l, p]), R.push(new nm(m, E, r, [e.clone(), K, c.clone()])), x[0].push([l.clone(), N, p.clone()]))
				}
		};
		Wl.prototype = Jl(lh);
		var qf = function(Y, x, B, e, N, y) {
			ir.call(this), Y = Y || .33, x = x || .17, e = e || 8, B = B || 6, N = N || 0, y = y || Z;
			for(var z = new ze, M = [], P = [], H = 0; e >= H; H++)
				for(var k = H / e * Z + V, D = 0; B >= D; D++) {
					var g = D / B * y + N;
					z.x = Y * s(g), z.z = -Y * L(g);
					var j = new ze,
						t = Y + x * s(k);
					j.x = t * s(g), j.z = -t * L(g), j.y = x * L(k), this.vertices.push(j), M.push(new rq(D / B, 1 - H / e)), P.push(j.clone().sub(z).normalize())
				}
			for(var H = 1; e >= H; H++)
				for(var D = 1; B >= D; D++) {
					var $ = (B + 1) * H + D - 1,
						f = (B + 1) * (H - 1) + D - 1,
						i = (B + 1) * (H - 1) + D,
						w = (B + 1) * H + D,
						l = new nm($, f, w, [P[$].clone(), P[f].clone(), P[w].clone()]);
					this.faces.push(l), this.faceVertexUvs[0].push([M[$].clone(), M[f].clone(), M[w].clone()]), l = new nm(f, i, w, [P[f].clone(), P[i].clone(), P[w].clone()]), this.faces.push(l), this.faceVertexUvs[0].push([M[f].clone(), M[i].clone(), M[w].clone()])
				}
			this.computeFaceNormals()
		};
		qf.prototype = Jl(lh);
		var Wg = function(p, r, P) {
				return p ? (ir.call(this), p = p instanceof Array ? p : [p], this.addShapeList(p, r), r.convertYZ !== !1 && te(this, P), this.computeFaceNormals(), void 0) : (p = [], void 0)
			},
			cf = Wg.prototype = Jl(ir.prototype);
		cf.addShapeList = function(w, X) {
			for(var $ = w.length, o = 0; $ > o; o++) {
				var u = w[o];
				this.addShape(u, X)
			}
		}, cf.addShape = function(o, n) {
			function M() {
				if(n.bottom)
					for(var p = 0; i > p; p++) G = U[p], F(G[2], G[1], G[0], !0);
				if(n.top)
					for(p = 0; i > p; p++) G = U[p], F(G[0] + t * B, G[1] + t * B, G[2] + t * B, !1)
			}

			function Y() {
				var _ = 0;
				for(q(y, _), _ += y.length, J = 0, C = N.length; C > J; J++) D = N[J], q(D, _), _ += D.length
			}

			function q(M, $) {
				for(var H, b, k = M.length; --k >= 0;) {
					H = k, b = k - 1, 0 > b && (b = M.length - 1);
					var I = 0,
						h = B;
					for(I = 0; h > I; I++) {
						var m = t * I,
							x = t * (I + 1),
							w = $ + H + m,
							P = $ + b + m,
							G = $ + b + x,
							f = $ + H + x;
						W(w, P, G, f, M, I, h, H, b)
					}
				}
			}

			function O(Y, $, x) {
				K.vertices.push(new ze(Y, $, x))
			}

			function F(z, A, j, m) {
				z += e, A += e, j += e, K.faces.push(new nm(z, A, j, null, null, m ? 2 : 1));
				var C = m ? l.generateBottomUV(K, o, n, z, A, j) : l.generateTopUV(K, o, n, z, A, j);
				K.faceVertexUvs[0].push(C)
			}

			function W(L, H, z, D, q, O, j, f, k) {
				L += e, H += e, z += e, D += e, K.faces.push(new nm(L, H, D)), K.faces.push(new nm(H, z, D));
				var w = l.generateSideWallUV(K, o, q, n, L, H, z, D, O, j, f, k);
				K.faceVertexUvs[0].push([w[0], w[1], w[3]]), K.faceVertexUvs[0].push([w[1], w[2], w[3]])
			}
			var I, E, x, u, h, X = n.amount,
				A = n.curveSegments || Sr,
				B = n.steps || 1,
				w = n.extrudePath,
				Q = !1,
				l = new Wr(n.repeatUVLength);
			w && (I = w.getSpacedPoints(B), Q = !0, E = n.frames !== S ? n.frames : new fn.FrenetFrames(w, B, !1), x = new ze, u = new ze, h = new ze);
			var D, J, C, K = this,
				e = this.vertices.length,
				_ = o.extractPoints(A),
				d = _.shape,
				N = _.holes,
				R = !di.isClockWise(d);
			if(R) {
				for(d = d.reverse(), J = 0, C = N.length; C > J; J++) D = N[J], di.isClockWise(D) && (N[J] = D.reverse());
				R = !1
			}
			var U = di.triangulateShape(d, N),
				y = d;
			for(J = 0, C = N.length; C > J; J++) D = N[J], d = d.concat(D);
			for(var z, G, t = d.length, i = U.length, g = 0; t > g; g++) z = d[g], Q ? (u.copy(E.normals[0]).multiplyScalar(z.x), x.copy(E.binormals[0]).multiplyScalar(z.y), h.copy(I[0]).add(u).add(x), O(h.x, h.y, h.z)) : O(z.x, z.y, 0);
			var f;
			for(f = 1; B >= f; f++)
				for(g = 0; t > g; g++) z = d[g], Q ? (u.copy(E.normals[f]).multiplyScalar(z.x), x.copy(E.binormals[f]).multiplyScalar(z.y), h.copy(I[f]).add(u).add(x), O(h.x, h.y, h.z)) : O(z.x, z.y, X / B * f);
			M(), Y()
		};
		var fn = function(c, i, z, Y, F) {
			function P(Z, S, T) {
				return W.vertices.push(new ze(Z, S, T)) - 1
			}
			ir.call(this), i = i || 64, z = z || 1, Y = Y || 8, F = F || !1;
			var y, l, n, M, T, I, t, o, b, N, q, v, E, B, e, D, J, h, S, k, f = [],
				W = this,
				X = i + 1,
				G = new ze,
				m = new fn.FrenetFrames(c, i, F),
				Q = m.tangents,
				j = m.normals,
				A = m.binormals;
			for(this.tangents = Q, this.normals = j, this.binormals = A, b = 0; X > b; b++)
				for(f[b] = [], M = b / (X - 1), o = c.getPointAt(M), y = Q[b], l = j[b], n = A[b], N = 0; Y > N; N++) T = N / Y * Z, I = -z * s(T), t = z * L(T), G.copy(o), G.x += I * l.x + t * n.x, G.y += I * l.y + t * n.y, G.z += I * l.z + t * n.z, f[b][N] = P(G.x, G.y, G.z);
			for(b = 0; i > b; b++)
				for(N = 0; Y > N; N++) q = F ? (b + 1) % i : b + 1, v = (N + 1) % Y, E = f[b][N], B = f[q][N], e = f[q][v], D = f[b][v], J = new rq(b / i, N / Y), h = new rq((b + 1) / i, N / Y), S = new rq((b + 1) / i, (N + 1) / Y), k = new rq(b / i, (N + 1) / Y), this.faces.push(new nm(E, B, D)), this.faceVertexUvs[0].push([J, h, k]), this.faces.push(new nm(B, e, D)), this.faceVertexUvs[0].push([h.clone(), S, k.clone()]);
			this.computeFaceNormals(), this.computeVertexNormals()
		};
		fn.prototype = Jl(lh), fn.FrenetFrames = function(o, e, j) {
			function W() {
				O[0] = new ze, z[0] = new ze, x = Number.MAX_VALUE, u = d($[0].x), J = d($[0].y), y = d($[0].z), x >= u && (x = u, N.set(1, 0, 0)), x >= J && (x = J, N.set(0, 1, 0)), x >= y && N.set(0, 0, 1), Y.crossVectors($[0], N).normalize(), O[0].crossVectors($[0], Y), z[0].crossVectors($[0], O[0])
			}
			var f, x, u, J, y, B, I, N = new ze,
				$ = [],
				O = [],
				z = [],
				Y = new ze,
				g = new $g,
				U = e + 1,
				i = 1e-4;
			for(this.tangents = $, this.normals = O, this.binormals = z, B = 0; U > B; B++) I = B / (U - 1), $[B] = o.getTangentAt(I), $[B].normalize();
			for(W(), B = 1; U > B; B++) O[B] = O[B - 1].clone(), z[B] = z[B - 1].clone(), Y.crossVectors($[B - 1], $[B]), Y.length() > i && (Y.normalize(), f = G(bo($[B - 1].dot($[B]), -1, 1)), O[B].applyMatrix4(g.makeRotationAxis(Y, f))), z[B].crossVectors($[B], O[B]);
			if(j)
				for(f = G(bo(O[0].dot(O[U - 1]), -1, 1)), f /= U - 1, $[0].dot(Y.crossVectors(O[0], O[U - 1])) > 0 && (f = -f), B = 1; U > B; B++) O[B].applyMatrix4(g.makeRotationAxis($[B], f * B)), z[B].crossVectors($[B], O[B])
		};
		var Ni = function(k, i, A, j) {
			ir.call(this), i = i || 18, A = A || 0, j = j == _ ? Z : j;
			for(var u = 1 / (k.length - 1), W = 1 / i, K = 0, V = i; V >= K; K++)
				for(var P = A + K * W * j, x = s(P), d = L(P), X = 0, H = k.length; H > X; X++) {
					var r = k[X],
						w = new ze;
					w.x = x * r.x - d * r.y, w.y = d * r.x + x * r.y, w.z = r.z, this.vertices.push(w)
				}
			for(var z = k.length, K = 0, V = i; V > K; K++)
				for(var X = 0, H = k.length - 1; H > X; X++) {
					var g = X + z * K,
						t = g,
						T = g + z,
						x = g + 1 + z,
						q = g + 1,
						E = K * W,
						U = X * u,
						v = E + W,
						S = U + u;
					this.faces.push(new nm(t, q, T)), this.faceVertexUvs[0].push([new rq(E, U), new rq(E, S), new rq(v, U)]), this.faces.push(new nm(T, q, x)), this.faceVertexUvs[0].push([new rq(v, U), new rq(E, S), new rq(v, S)])
				}
			this.mergeVertices(), te(this), this.computeFaceNormals(), this.computeVertexNormals()
		};
		Ni.prototype = Jl(lh);
		var bm = function(u, j) {
			j = j || {};
			var H = rk.generateShapes(u, j);
			j.amount = j.amount !== S ? j.amount : .5, j.convertYZ = !1, j.fill !== !1 && (j.bottom = !0, j.top = !0), Wg.call(this, H, j)
		};
		bm.prototype = Jl(cf);
		var bf = z.Node = function() {
				wp(bf, this)
			},
			pm = {
				X: Yk,
				Y: Rr,
				Z: oe
			},
			Dd = {
				xyz: "XYZ",
				xzy: "XZY",
				yxz: "YXZ",
				yzx: "YZX",
				zxy: "ZXY",
				zyx: "ZYX"
			},
			Hd = "xzy",
			Dl = function(M, s, G) {
				if(s) {
					var v = s[0],
						g = s[1],
						F = s[2];
					"xzy" === G ? (Rr(M, g), oe(M, F), Yk(M, v)) : "xyz" === G ? (oe(M, F), Rr(M, g), Yk(M, v)) : "yxz" === G ? (oe(M, F), Yk(M, v), Rr(M, g)) : "yzx" === G ? (Yk(M, v), oe(M, F), Rr(M, g)) : "zxy" === G ? (Rr(M, g), Yk(M, v), oe(M, F)) : "zyx" === G ? (Yk(M, v), Rr(M, g), oe(M, F)) : (Rr(M, g), oe(M, F), Yk(M, v))
				}
			};
		Bm("Node", No, {
			ms_ac: ["rotationMode", "anchorElevation"],
			_adjustChildrenToTop: !0,
			_icon: "node_icon",
			_image: "node_image",
			_rotationMode: Hd,
			_64O: 0,
			_rotationX: 0,
			_53O: 0,
			_host: _,
			_position: {
				x: 0,
				y: 0
			},
			_anchor: {
				x: .5,
				y: .5
			},
			_anchorElevation: .5,
			_scale: {
				x: 1,
				y: 1
			},
			_scaleTall: 1,
			_54O: 0,
			getUIClass: function() {
				return kc
			},
			_22Q: function() {
				return Xo
			},
			getX: function() {
				return this.p().x
			},
			setX: function(c) {
				this.p(c, this.p().y)
			},
			getY: function() {
				return this.p().y
			},
			setY: function(u) {
				this.p(this.p().x, u)
			},
			getAnchorX: function() {
				return this.getAnchor().x
			},
			setAnchorX: function(R) {
				this.setAnchor(R, this.getAnchor().y)
			},
			getAnchorY: function() {
				return this.getAnchor().y
			},
			setAnchorY: function(R) {
				this.setAnchor(this.getAnchor().x, R)
			},
			getScaleX: function() {
				return this.getScale().x
			},
			setScaleX: function(W) {
				this.setScale(W, this.getScale().y)
			},
			getScaleY: function() {
				return this.getScale().y
			},
			setScaleY: function(t) {
				this.setScale(this.getScale().x, t)
			},
			p: function() {
				return 0 === arguments.length ? this.getPosition() : (this.setPosition.apply(this, arguments), this)
			},
			p3: function() {
				return 0 === arguments.length ? this.getPosition3d() : (this.setPosition3d.apply(this, arguments), this)
			},
			s3: function() {
				return 0 === arguments.length ? this.getSize3d() : (this.setSize3d.apply(this, arguments), this)
			},
			r3: function() {
				return 0 === arguments.length ? this.getRotation3d() : (this.setRotation3d.apply(this, arguments), this)
			},
			t3: function() {
				return this.translate3d.apply(this, arguments), this
			},
			translate3dBy: function(D, z) {
				ph(D, Uj(_, _, this.r3(), this.getRotationMode())), this.translate3d(D[0] * z, D[1] * z, D[2] * z)
			},
			translateFront: function(K) {
				this.translate3dBy([0, 0, 1], K)
			},
			translateBack: function(b) {
				this.translate3dBy([0, 0, -1], b)
			},
			translateLeft: function(z) {
				this.translate3dBy([-1, 0, 0], z)
			},
			translateRight: function(g) {
				this.translate3dBy([1, 0, 0], g)
			},
			translateTop: function(z) {
				this.translate3dBy([0, 1, 0], z)
			},
			translateBottom: function(p) {
				this.translate3dBy([0, -1, 0], p)
			},
			getPosition3d: function() {
				return [this._position.x, this._54O, this._position.y]
			},
			setPosition3d: function(u, N, O) {
				1 === arguments.length && (N = u[1], O = u[2], u = u[0]), this.p(u, O), this.setElevation(N)
			},
			translate3d: function(U, i, F) {
				1 === arguments.length && (i = U[1], F = U[2], U = U[0]), this.translate(U, F), this.setElevation(this._54O + i)
			},
			getSize3d: function() {
				return [this.getWidth(), this.getTall(), this.getHeight()]
			},
			setSize3d: function(R, V, i) {
				1 === arguments.length && (V = R[1], i = R[2], R = R[0]), this.setSize(R, i), this.setTall(V)
			},
			getRotation3d: function() {
				return [this._rotationX, -this._64O, this._53O]
			},
			setRotation3d: function(K, E, o) {
				1 === arguments.length && (E = K[1], o = K[2], K = K[0]), this.setRotationX(K), this.setRotation(-E), this.setRotationZ(o)
			},
			setRotationY: function(S) {
				this.setRotation(-S)
			},
			getRotationY: function() {
				return -this._64O
			},
			lookAt: function(E, F) {
				F = F || np;
				var m = this,
					h = Jn(E, m.p3()),
					d = uh(h);
				F === np ? (m.r3([-H(h[1] / d), -c(h[2], h[0]) + o, 0]), m.setRotationMode("xzy")) : F === Td ? (m.r3(0, -c(h[2], h[0]), H(h[1] / d)), m.setRotationMode("zyx")) : F === vr ? (m.r3(0, -c(h[2], h[0]) + V, -H(h[1] / d)), m.setRotationMode("zyx")) : F === Pi ? (m.r3([-H(h[1] / d) + o, -c(h[2], h[0]) + o, 0]), m.setRotationMode("xzy")) : F === ed && (m.r3([-H(h[1] / d) - o, -c(h[2], h[0]) + o, 0]), m.setRotationMode("xzy")), F === Cp && (m.r3([-H(h[1] / d) + V, -c(h[2], h[0]) + o, V]), m.setRotationMode("zxy"))
			},
			getLoopedEdges: function() {
				return this._45I
			},
			getEdges: function() {
				return this._70O
			},
			getAgentEdges: function() {
				return this._49I
			},
			getHost: function() {
				return this._host
			},
			setHost: function(X) {
				var J = this;
				if(J !== X && J._host !== X) {
					var o = J._host;
					o && o._removeAttach(J), J._host = X, J._host && J._host._addAttach(J), J.fp("host", o, X), J.onHostChanged(o, X)
				}
			},
			getAttaches: function() {
				return this._69O
			},
			_addAttach: function(E) {
				var B = this;
				B._69O || (B._69O = new ag), B._69O.add(E), B.fp("attaches", _, E)
			},
			_removeAttach: function(z) {
				var f = this;
				f._69O.remove(z), f._69O.isEmpty() && delete f._69O, f.fp("attaches", z, _)
			},
			getSourceEdges: function() {
				return this._42I
			},
			getTargetEdges: function() {
				return this._43I
			},
			_2I: function(w) {
				var y = this;
				y._44I || (y._44I = new ag), y._42I || (y._42I = new ag), y._44I.add(w), y._42I.add(w), y._20I()
			},
			_4I: function(O) {
				var H = this;
				H._44I || (H._44I = new ag), H._43I || (H._43I = new ag), H._44I.add(O), H._43I.add(O), H._20I()
			},
			_16I: function(C) {
				var X = this;
				X._44I.remove(C), X._42I.remove(C), X._44I.isEmpty() && delete X._44I, X._42I.isEmpty() && delete X._42I, X._20I()
			},
			_18I: function(J) {
				var x = this;
				x._44I.remove(J), x._43I.remove(J), x._44I.isEmpty() && delete x._44I, x._43I.isEmpty() && delete x._43I, x._20I()
			},
			_20I: function() {
				var M = this;
				if(delete M._45I, !M._44I || M._44I.isEmpty()) return delete M._70O, void 0;
				var j;
				M._44I.each(function(B) {
					B.isLooped() && (j || (j = {}), j[B._id] || (M._45I || (M._45I = new ag), M._45I.add(B), j[B._id] = B))
				}), j ? (M._70O = new ag, M._44I.each(function(F) {
					j[F._id] ? "A" === j[F._id] || (j[F._id] = "A", M._70O.add(F)) : M._70O.add(F)
				})) : M._70O = M._44I
			},
			hasAgentEdges: function() {
				return !!this._49I && !this._49I.isEmpty()
			},
			getSourceAgentEdges: function() {
				return this._46I
			},
			getTargetAgentEdges: function() {
				return this._47I
			},
			_1I: function(v) {
				var Q = this;
				Q._46I || (Q._46I = new ag), Q._48I || (Q._48I = new ag), Q._46I.add(v), Q._48I.add(v), Q._19I()
			},
			_3I: function(T) {
				var D = this;
				D._47I || (D._47I = new ag), D._48I || (D._48I = new ag), D._47I.add(T), D._48I.add(T), D._19I()
			},
			_15I: function(z) {
				var g = this;
				g._46I.remove(z), g._48I.remove(z), g._46I.isEmpty() && delete g._46I, g._48I.isEmpty() && delete g._48I, g._19I()
			},
			_17I: function(G) {
				var _ = this;
				_._47I.remove(G), _._48I.remove(G), _._47I.isEmpty() && delete _._47I, _._48I.isEmpty() && delete _._48I, _._19I()
			},
			_19I: function() {
				var c = this;
				delete c._49I;
				var H = c._48I;
				if(H && !H.isEmpty()) {
					var X = {};
					H.each(function(p) {
						X[p._id] ? c._49I || (c._49I = new ag) : X[p._id] = p
					}), c._49I ? H.each(function(A) {
						X[A._id] && (c._49I.add(A), delete X[A._id])
					}) : c._49I = H
				}
			},
			getImage: function() {
				if(this._pendingCheckImageJSON) {
					var i = h.getImage(this._image);
					i && (this._pendingCheckImageJSON = !1, this.getParent() instanceof Ao && this.getParent().checkPendingUpdateInfo())
				}
				return this._image
			},
			setImage: function(E) {
				var b = this,
					h = b._image,
					G = b.getWidth(),
					m = b.getHeight();
				b._image = E, b.fp("image", h, E) && (null != E && (Ki(E) || Ol(E) && /\.json$/i.test(E)) && (this._pendingCheckImageJSON = !0), b.fp(kb, G, b.getWidth()), b.fp(Yo, m, b.getHeight()))
			},
			getElevation: function() {
				return this._54O
			},
			setElevation: function(p) {
				var D = this;
				if(!D._50O) {
					D._50O = 1;
					var A = D._54O;
					D._54O = p, D.fp(mf, A, p), delete this._50O
				}
			},
			getRotation: function() {
				return this._64O
			},
			setRotation: function(O) {
				var M = this;
				if(!M._49O) {
					M._49O = 1;
					var v = M._64O;
					M._64O = O, M.fp(pl, v, O), delete M._49O
				}
			},
			getRotationX: function() {
				return this._rotationX
			},
			setRotationX: function(s) {
				var K = this;
				if(!K._51O) {
					K._51O = 1;
					var R = K._rotationX;
					K._rotationX = s, K.fp("rotationX", R, s), delete K._51O
				}
			},
			getRotationZ: function() {
				return this._53O
			},
			setRotationZ: function(I) {
				var Z = this;
				if(!Z._52O) {
					Z._52O = 1;
					var s = Z._53O;
					Z._53O = I, Z.fp("rotationZ", s, I), delete Z._52O
				}
			},
			getPosition: function() {
				return this._position
			},
			setPosition: function(J, B) {
				var w = this;
				if(!w._50I) {
					w._50I = 1;
					var x;
					if(x = 2 === arguments.length ? {
							x: J,
							y: B
						} : J, x.x !== w._position.x || x.y !== w._position.y) {
						var u = w._position;
						w._position = x, w.fp(Mh, u, x)
					}
					delete w._50I
				}
			},
			translate: function(c, n) {
				var M = this._position;
				this.p(M.x + c, M.y + n)
			},
			getWidth: function() {
				var e = this;
				if(e._width >= 0) return e._width;
				var A = e.getStyle("shape3d");
				if(A) {
					var M = gk(A);
					if(M && M.rawS3) return M.rawS3[0]
				}
				var t = Ui(e._image);
				return t ? ui(t, e) : 20
			},
			setWidth: function(g) {
				var $ = this,
					E = $._width;
				$._width = g, $.fp(kb, E, g)
			},
			getHeight: function() {
				var q = this;
				if(q._height >= 0) return q._height;
				var v = q.getStyle("shape3d");
				if(v) {
					var U = gk(v);
					if(U && U.rawS3) return U.rawS3[2]
				}
				var H = Ui(q._image);
				return H ? Hk(H, q) : 20
			},
			setHeight: function(B) {
				var b = this,
					k = b._height;
				b._height = B, b.fp(Yo, k, B)
			},
			getTall: function() {
				var k = this;
				if(k._tall >= 0) return k._tall;
				var v = k.getStyle("shape3d");
				if(v) {
					var X = gk(v);
					if(X && X.rawS3) return X.rawS3[1]
				}
				return 20
			},
			setTall: function(F) {
				var n = this,
					D = n._tall;
				n._tall = F, n.fp("tall", D, F)
			},
			setSize: function(_, v) {
				var l = this;
				2 === arguments.length ? (l.setWidth(_), l.setHeight(v)) : (l.setWidth(_.width), l.setHeight(_.height))
			},
			getSize: function() {
				return {
					width: this.getWidth(),
					height: this.getHeight()
				}
			},
			setRect: function(o, $, x, M, e) {
				var B = this,
					J = B.getAnchor(),
					y = B.getScale();
				arguments.length <= 2 && (e = $, $ = o.y, x = o.width, M = o.height, o = o.x);
				var P = e && y.x < 0 ? 1 - J.x : J.x,
					A = e && y.y < 0 ? 1 - J.y : J.y;
				B.p(o + x * P, $ + M * A), e && (x /= Math.abs(y.x), M /= Math.abs(y.y)), B.setWidth(x), B.setHeight(M)
			},
			getMatrix: function() {
				var b = this,
					s = b._64O,
					r = b._position,
					h = b.getScale();
				return new Fi(s, r.x, r.y, h.x, h.y)
			},
			getAnchorRect: function() {
				var M = this,
					R = M.getWidth(),
					k = M.getHeight(),
					d = M.getAnchor();
				return {
					x: -R * d.x,
					y: -k * d.y,
					width: R,
					height: k
				}
			},
			toLocal: function(t) {
				return this.getMatrix().tfi(t)
			},
			toGlobal: function(d) {
				return this.getMatrix().tf(d)
			},
			isInRect: function(v) {
				v = this.toLocal(v);
				var x = this.getWidth(),
					p = this.getHeight();
				return v.x += x * this.getAnchorX(), v.y += p * this.getAnchorY(), !(v.x < 0 || v.y < 0 || v.x > x || v.y > p)
			},
			getRect: function() {
				var j = this,
					i = j.getWidth(),
					y = j.getHeight(),
					U = j.getAnchor(),
					S = {
						x: -i * U.x,
						y: -y * U.y,
						width: i,
						height: y
					},
					n = j.getMatrix();
				return S = kl([n.tf(S.x, S.y), n.tf(S.x + S.width, S.y), n.tf(S.x + S.width, S.y + S.height), n.tf(S.x, S.y + S.height)])
			},
			getAnchorElevation: function() {
				return this._anchorElevation
			},
			getAnchor3d: function() {
				var Z = this,
					Y = Z.getAnchor(),
					K = Z._anchorElevation;
				return {
					x: Y.x,
					y: K,
					z: Y.y
				}
			},
			setAnchorElevation: function(S) {
				var J = this,
					K = J._anchorElevation;
				K !== S && (J._anchorElevation = S, J.fp("anchorElevation", K, S))
			},
			setAnchor3d: function(E, t, k, B) {
				var l, m = this;
				"number" == typeof E ? l = {
					x: E,
					y: t,
					z: k
				} : (l = E.length ? {
					x: E[0],
					y: E[1],
					z: E[2]
				} : E, B = t), m.setAnchor(l.x, l.z, B), m.setAnchorElevation(l.y)
			},
			getAnchor: function() {
				var V = this;
				if(V.hasOwnProperty("_anchor")) return V._anchor;
				var t = Ui(V._image);
				return t && t.anchorX !== S ? {
					x: t.anchorX,
					y: t.anchorY
				} : V._anchor
			},
			setAnchor: function(o, x, Y) {
				var I, k = this;
				"number" == typeof o ? I = {
					x: o,
					y: x
				} : (I = o.length ? {
					x: o[0],
					y: o[1]
				} : o, Y = x);
				var H = k.getAnchor();
				if(H.x !== I.x || H.y !== I.y) {
					var G = k.getDataModel();
					if(G && G.beginTransaction(), k._anchor = I, k.fp("anchor", H, I), Y && !he) {
						var S = k.getPosition(),
							u = k.getSize(),
							J = k.getRotation(),
							e = k.getScale(),
							m = -u.width * (H.x - I.x) * e.x,
							A = -u.height * (H.y - I.y) * e.y,
							T = L(J),
							_ = s(J);
						k.setPosition(S.x + _ * m - T * A, S.y + T * m + _ * A)
					}
					G && G.endTransaction()
				}
			},
			getScale: function() {
				return this._scale
			},
			setScale: function(K, U) {
				var l, t = this;
				l = 2 === arguments.length ? {
					x: K,
					y: U
				} : K;
				var V = t.getScale();
				(V.x !== l.x || V.y !== l.y) && (t._scale = l, t.fp("scale", V, l))
			},
			getScaleTall: function() {
				return this._scaleTall
			},
			getScale3d: function() {
				var $ = this,
					C = $._scaleTall,
					F = $.getScale();
				return [F.x, C, F.y]
			},
			getFinalScale3d: function() {
				var Y = this,
					L = Y.s3(),
					b = Y._dynamicScale3d,
					k = Y.getScale3d();
				return L && (k[0] *= L[0], k[1] *= L[1], k[2] *= L[2]), b && (k[0] *= b[0], k[1] *= b[1], k[2] *= b[2]), k
			},
			setScaleTall: function(l) {
				var y = this,
					u = y._scaleTall;
				u !== l && (y._scaleTall = l, y.fp("scaleTall", u, l))
			},
			setScale3d: function(o, $, _) {
				var s, H = this;
				s = "number" == typeof o ? {
					x: o,
					y: $,
					z: _
				} : o.length ? {
					x: o[0],
					y: o[1],
					z: o[2]
				} : o, H.setScaleTall(s.y), H.setScale(s.x, s.z)
			},
			getCorners: function(m, g) {
				m == _ && (m = 0), g == _ && (g = m);
				var w = this,
					v = w.getAnchor(),
					p = w.getWidth(),
					r = w.getHeight(),
					Z = -p * v.x - m,
					d = -r * v.y - g,
					M = p + 2 * m,
					e = r + 2 * g,
					T = w.getMatrix();
				return [T.tf(Z, d), T.tf(Z, d + e), T.tf(Z + M, d + e), T.tf(Z + M, d)]
			},
			getEditControlPoints: function(D, r, y) {
				r == _ && (r = 0), y == _ && (y = r);
				var I = this,
					w = I.getAnchor(),
					p = I.getWidth(),
					U = I.getHeight(),
					s = -p * w.x - r,
					$ = -U * w.y - y,
					d = p + 2 * r,
					z = U + 2 * y;
				if(D) return [{
					x: s,
					y: $
				}, {
					x: s,
					y: 0
				}, {
					x: s,
					y: $ + z
				}, {
					x: 0,
					y: $ + z
				}, {
					x: s + d,
					y: $ + z
				}, {
					x: s + d,
					y: 0
				}, {
					x: s + d,
					y: $
				}, {
					x: 0,
					y: $
				}];
				var W = I.getMatrix();
				return [W.tf(s, $), W.tf(s, 0), W.tf(s, $ + z), W.tf(0, $ + z), W.tf(s + d, $ + z), W.tf(s + d, 0), W.tf(s + d, $), W.tf(0, $)]
			},
			rotateAt: function(O, f, G) {
				var b = this,
					D = b._position,
					H = b._64O,
					d = new Fi(H, D.x, D.y).tf(O, f),
					w = n(O * O + f * f),
					l = c(D.y - d.y, D.x - d.x) + G;
				b.setRotation(H + G), b.p(d.x + w * s(l), d.y + w * L(l))
			},
			onParentChanged: function() {
				bf.superClass.onParentChanged.apply(this, arguments), this._8I()
			},
			_8I: function() {
				this._70O && this._70O.each(function(o) {
					o._7I()
				})
			},
			onPropertyChanged: function(b) {
				var H = this;
				bf.superClass.onPropertyChanged.call(H, b), H._69O && H._69O.each(function(Q) {
					Q.handleHostPropertyChange(b)
				}), H._49I && H._49I.each(function(v) {
					v.fp("agentChange", !0, !1)
				})
			},
			onHostChanged: function() {
				this.updateAttach()
			},
			handleHostPropertyChange: function(j) {
				this.updateAttach(j)
			},
			onStyleChanged: function(R) {
				bf.superClass.onStyleChanged.apply(this, arguments), Wm[R] && this.updateAttach()
			},
			updateAttach: function(N) {
				var U = this;
				U._51I || he || (U._51I = 1, U._71O(N), delete U._51I)
			},
			_71O: function(q) {
				var m, t, S, M, N, G, f = this,
					p = f._host,
					Q = q ? q.property : _,
					e = q ? q.oldValue : _,
					I = q ? q.newValue : _;
				if(p instanceof z.Grid) {
					if(Q === mf) f.setElevation(f._54O + I - e);
					else if(!q || ah[Q]) {
						if(m = f.s("attach.row.index"), t = f.s("attach.column.index"), S = p.getCellRect(m, t), !S) return;
						M = f.s("attach.row.span"), N = f.s("attach.column.span"), (1 !== M || 1 !== N) && (S = Xl(S, p.getCellRect(m + M - 1, t + N - 1))), ke(S, f, "attach.padding", 1), f.setRect(S)
					}
				} else if(p instanceof Mf && (G = f.s("attach.index")) >= 0 && (!q || $p[Q])) {
					var d = f.s("attach.thickness");
					d != _ && f.setHeight(p.getThickness() * d);
					var D = f.s("attach.offset"),
						k = p.getPoints(),
						T = k.size();
					if(T > G) {
						var R = k.get(G),
							B = T === G + 1 ? k.get(0) : k.get(G + 1),
							X = [B.x - R.x, B.y - R.y],
							g = uh(X);
						if(g) {
							f.s("attach.offset.relative") && (D *= g), f.s("attach.offset.opposite") && (D = g - D);
							var V = {
									x: R.x + X[0] / g * D,
									y: R.y + X[1] / g * D
								},
								s = f.s("attach.gap");
							s && (f.s("attach.gap.relative") && (s *= p.getThickness()), V = Kc(_, V, B, s)), f.p(V), f.setRotation(c(X[1], X[0]))
						}
					}
				} else q && (Q === Mh ? f.translate(I.x - e.x, I.y - e.y) : Q === mf ? f.setElevation(f._54O + I - e) : Fm[Q] && f._11Q(p, Q, I - e))
			},
			_11Q: function(z, o, L) {
				var t = this,
					$ = z.p3(),
					J = Jn(t.p3(), $),
					l = Wh(),
					B = Dd[t.getRotationMode()],
					E = B[0],
					R = B[1],
					I = B[2],
					b = pm[E],
					Q = pm[R],
					F = pm[I];
				o === pl && (o = "rotationY", L = -L), o === pl + E ? (F(l, z[km + I]()), Q(l, z[km + R]()), b(l, L), Q(l, -z[km + R]()), F(l, -z[km + I]()), t[fd + E](t[km + E]() + L)) : o === pl + R ? (F(l, z[km + I]()), Q(l, L), F(l, -z[km + I]()), t[fd + R](t[km + R]() + L)) : o === pl + I && (F(l, L), t[fd + I](t[km + I]() + L)), ph(J, l), t.p3($[0] + J[0], $[1] + J[1], $[2] + J[2])
			},
			isHostOn: function(e) {
				var w = this;
				if(w._host && e && e._69O)
					for(var h = {}, x = w._host; x && x !== w && !h[x._id];) {
						if(x === e) return !0;
						h[x._id] = x, x = x._host
					}
				return !1
			},
			isLoopedHostOn: function(t) {
				return this.isHostOn(t) && t.isHostOn(this)
			},
			getSerializableProperties: function() {
				var d = bf.superClass.getSerializableProperties.call(this);
				return yi(d, {
					image: 1,
					host: 1,
					rotation: 1,
					rotationX: 1,
					rotationZ: 1,
					rotationMode: 1,
					position: 1,
					anchor: 1,
					anchorElevation: 1,
					scale: 1,
					scaleTall: 1,
					_width: 1,
					_height: 1,
					_tall: 1,
					elevation: 1
				}), d
			}
		});
		var mq = z.Edge = function(p, T) {
			var V = this;
			wp(mq, V), V.setSource(p), V.setTarget(T)
		};
		Bm("Edge", No, {
			_icon: "edge_icon",
			getUIClass: function() {
				return yf
			},
			_22Q: function() {
				return qh
			},
			getSource: function() {
				return this._source
			},
			getTarget: function() {
				return this._target
			},
			getSourceAgent: function() {
				return this._40I
			},
			getTargetAgent: function() {
				return this._41I
			},
			setSource: function(V) {
				var k = this;
				if(k._source !== V) {
					var J = k._source;
					k._source = V, J && J._16I(k), V && V._2I(k), k._7I(), k.fp("source", J, V)
				}
			},
			setTarget: function(Q) {
				var T = this;
				if(T._target !== Q) {
					var A = T._target;
					T._target = Q, A && A._18I(T), Q && Q._4I(T), T._7I(), T.fp("target", A, Q)
				}
			},
			isLooped: function() {
				var T = this;
				return T._source === T._target && !!T._source && !!T._target
			},
			_7I: function() {
				var D, i = this,
					b = Kl(i);
				i._40I !== b && (D = this._40I, D && D._15I(i), i._40I = b, b && b._1I(i), i.fp("sourceAgent", D, b), cj(D, i._41I), cj(b, i._41I));
				var B = He(i);
				i._41I !== B && (D = i._41I, D && D._17I(i), i._41I = B, B && B._3I(i), i.fp("targetAgent", D, B), cj(D, i._40I), cj(B, i._40I))
			},
			_22I: function(o) {
				this._52I = o, this.fp("edgeGroup", !0, !1)
			},
			getEdgeGroup: function() {
				return this._52I
			},
			isEdgeGroupHidden: function() {
				var J = this;
				return J._52I && J._52I.get(0) !== J && !J.getStyle($b)
			},
			getEdgeGroupSize: function() {
				return this._52I ? this._52I.size() : 1
			},
			getEdgeGroupIndex: function() {
				return this._52I ? this._52I.indexOf(this) : 0
			},
			isEdgeGroupAgent: function() {
				var u = this,
					m = u._52I;
				return m && !u.getStyle($b) && m.size() > 1 && u === m.get(0)
			},
			toggle: function() {
				var w = this._52I,
					l = !this.s($b);
				w && w.size() > 1 && (w.each(function($) {
					$.s($b, l)
				}), w.getSiblings().each(function(o) {
					o !== w && o.each(function(b) {
						b.fp("edgeGroup", _, o)
					})
				}))
			},
			setStyle: function(u, k) {
				(u === tq || "edge.segments" === u) && (k = Cn(k)), mq.superClass.setStyle.call(this, u, k)
			},
			onStyleChanged: function(j) {
				mq.superClass.onStyleChanged.apply(this, arguments), _n[j] && cj(this._41I, this._40I)
			},
			getSerializableProperties: function() {
				var D = mq.superClass.getSerializableProperties.call(this);
				return yi(D, {
					source: 1,
					target: 1
				}), D
			}
		});
		var Xf = z.Group = function() {
			wp(Xf, this)
		};
		Bm("Group", bf, {
			_image: "group_image",
			_icon: "group_icon",
			_57O: !1,
			getUIClass: function() {
				return Zo
			},
			onChildAdded: function() {
				Xf.superClass.onChildAdded.apply(this, arguments), this._81I()
			},
			onChildRemoved: function() {
				Xf.superClass.onChildRemoved.apply(this, arguments), this._81I()
			},
			_81I: function() {
				var U = this;
				if(!U._54I && !he) {
					var R = U.getChildrenRect();
					R && (U._53I = 1, U.p(Uc(U.s("group.position"), R, U.getSize())), delete U._53I)
				}
			},
			getChildrenRect: function() {
				var D, k = this;
				return k.eachChild(function(l) {
					D = Xl(D, k.getChildRect(l))
				}), D
			},
			getChildRect: function(D) {
				var d;
				return mm(D) && D.s(Wd) && (Go(D) && D.isExpanded() && D.eachChild(function(E) {
					d = Xl(d, D.getChildRect(E))
				}), !d && D.getRect && (d = D.getRect())), d
			},
			setPosition: function(m, u) {
				var Y = this;
				if(!Y._54I) {
					var p;
					p = 2 === arguments.length ? {
						x: m,
						y: u
					} : m, he || Y._53I || (Y._54I = 1, zj(Y._children, p.x - Y._position.x, p.y - Y._position.y), delete Y._54I), Xf.superClass.setPosition.call(this, p)
				}
			},
			toggle: function() {
				this.setExpanded(!this.isExpanded())
			},
			isExpanded: function() {
				return this._57O
			},
			setExpanded: function(V) {
				var B = this;
				if(B._57O !== V) {
					var t = B._57O;
					B._57O = V, B.fp("expanded", t, B._57O), B._8I()
				}
			},
			_8I: function() {
				Xf.superClass._8I.call(this), this.eachChild(function(v) {
					mm(v) && v._8I()
				})
			},
			onStyleChanged: function(l) {
				Xf.superClass.onStyleChanged.apply(this, arguments), "group.position" === l && this._81I()
			},
			getSerializableProperties: function() {
				var X = Xf.superClass.getSerializableProperties.call(this);
				return X.expanded = 1, X
			}
		});
		var es = z.Block = function() {
			wp(es, this)
		};
		Bm("Block", bf, {
			_icon: "block_icon",
			_clickThroughEnabled: !1,
			_syncSize: !0,
			ms_ac: ["clickThroughEnabled", "syncSize"],
			getUIClass: function() {
				return Sm
			},
			onChildAdded: function() {
				es.superClass.onChildAdded.apply(this, arguments), this.updateFromChildren()
			},
			onChildRemoved: function() {
				es.superClass.onChildRemoved.apply(this, arguments), this.updateFromChildren()
			},
			updateFromChildren: function() {
				var F = this;
				if(!he && !F._updatingToChildren && F._syncSize) {
					var q, c, P, p, g, O = [],
						U = F.getRotation();
					if(F.eachChild(function(P) {
							mm(P) && O.push.apply(O, P.getCorners())
						}), O.length) {
						F._updatingFromChildren = 1;
						var w = s(-U),
							$ = L(-U),
							j = 1 / 0,
							V = -1 / 0,
							S = 1 / 0,
							f = -1 / 0;
						for(p = 0, g = O.length; g > p; p++) P = O[p], q = P.x, c = P.y, P.x = w * q - $ * c, P.y = $ * q + w * c, j = R(j, P.x), V = N(V, P.x), S = R(S, P.y), f = N(f, P.y);
						var K = F.getScale();
						F.setSize(d((V - j) / K.x), d((f - S) / K.y));
						var J;
						K.x < 0 && (J = j, j = V, V = J), K.y < 0 && (J = S, S = f, f = J), w = s(U), $ = L(U);
						var h = F.getAnchor();
						q = j + (V - j) * h.x, c = S + (f - S) * h.y, F.setPosition(w * q - $ * c, $ * q + w * c), delete F._updatingFromChildren
					}
				}
			},
			setPosition: function(X, J) {
				var y = this;
				if(!y._updatingToChildren) {
					var n;
					n = 2 === arguments.length ? {
						x: X,
						y: J
					} : X, he || y._updatingFromChildren || (y._updatingToChildren = 1, zj(y._children, n.x - y._position.x, n.y - y._position.y), delete y._updatingToChildren), es.superClass.setPosition.call(this, n)
				}
			},
			setWidth: function(o) {
				return this.setSize(o, this.getHeight())
			},
			setHeight: function(L) {
				return this.setSize(this.getWidth(), L)
			},
			setSize: function(G, u) {
				1 > G && (G = 1), 1 > u && (u = 1);
				var Z = this;
				if(!Z._updatingToChildren) {
					2 !== arguments.length && (u = G.height, G = G.width);
					var M = Z.getWidth(),
						w = Z.getHeight();
					if(G !== M && es.superClass.setWidth.call(Z, G), u !== w && es.superClass.setHeight.call(Z, u), !he && !Z._updatingFromChildren) {
						Z._updatingToChildren = 1;
						var v = G / M,
							c = u / w;
						Z._adjustChildScaleOrSize(v, c, "size"), delete Z._updatingToChildren, Z.updateFromChildren()
					}
				}
			},
			_adjustChildScaleOrSize: function(J, B, T) {
				var Q = this;
				if(Q._syncSize) {
					var w = Q.getPosition(),
						k = Q.getRotation();
					Q.getScale(), Q.eachChild(function(O) {
						if(mm(O)) {
							var C = O.getPosition(),
								o = O.getRotation(),
								g = O.getWidth(),
								d = O.getHeight(),
								h = O.getScale(),
								i = h.x * g,
								F = h.y * d,
								I = new Fi(o, C.x, C.y, i, F);
							I.translate(-w.x, -w.y), I.rotate(-k), o = c(I.b * Math.sign(i), I.a * Math.sign(i)), I.scale(J, B);
							var G, Q, n, K = s(o);
							if(Math.abs(K) < .001 ? (G = L(o), Q = I.b / G, n = -I.c / G) : (Q = I.a / K, n = I.d / K), "scale" === T) O.setScale(Q / g, n / d);
							else if("size" === T) {
								var z = Q / h.x,
									H = n / h.y;
								O.setScale(id(Q) * Math.abs(h.x), id(n) * Math.abs(h.y)), O.setSize(Math.max(.1, Math.abs(z)), Math.max(.1, Math.abs(H)))
							}
							I.rotate(k), I.translate(w.x, w.y), O.setPosition(I.tx, I.ty)
						}
					})
				}
			},
			_calcChangeFactor: function(u, J, e, Y) {
				var W, S, z, i;
				return W = d(u), S = d(e), z = W > S ? W / S : S / W, W = d(J), S = d(Y), i = W > S ? W / S : S / W, N(z, i)
			},
			setAnchor: function() {
				var U = this;
				if(!U._updatingToChildren) {
					var S = U.getAnchor();
					if(es.superClass.setAnchor.apply(U, arguments), !he && !U._updatingFromChildren && U._syncSize) {
						U._updatingToChildren = 1;
						var v = U.getAnchor();
						U.getPosition();
						var y = U.getSize(),
							n = U.getScale(),
							W = U.getRotation(),
							V = -y.width * n.x * (S.x - v.x),
							N = -y.height * n.y * (S.y - v.y),
							u = L(W),
							o = s(W),
							O = o * V - u * N,
							J = u * V + o * N;
						U.eachChild(function(Q) {
							if(mm(Q)) {
								var Y = Q.getPosition();
								Q.setPosition(Y.x - O, Y.y - J)
							}
						}), delete U._updatingToChildren
					}
				}
			},
			setRotation: function(b) {
				var z = this;
				if(!z._updatingToChildren) {
					var e = z.getRotation();
					if(es.superClass.setRotation.apply(z, arguments), !he && !z._updatingFromChildren) {
						z._updatingToChildren = 1;
						var V = z.getPosition(),
							j = b - e;
						z.eachChild(function(P) {
							if(mm(P)) {
								var o = P.getMatrix();
								o.translate(-V.x, -V.y), o.rotate(j), o.translate(V.x, V.y);
								var X = Math.sign(P.getScale().x);
								P.setRotation(c(o.b * X, o.a * X)), P.setPosition(o.tx, o.ty)
							}
						}), delete z._updatingToChildren
					}
				}
			},
			setScale: function(E, v) {
				var x = this;
				if(!x._updatingToChildren) {
					null == v && (v = E.y, E = E.x);
					var y = x.getScale();
					if(d(E) < .01 && (E = .01 * (id(E) || id(y.x))), d(v) < .01 && (v = .01 * (id(v) || id(y.y))), es.superClass.setScale.call(x, E, v), !he && !x._updatingFromChildren) {
						x._updatingToChildren = 1;
						var Z = E / y.x,
							H = v / y.y;
						x._adjustChildScaleOrSize(Z, H, "size"), delete x._updatingToChildren, x.updateFromChildren()
					}
				}
			},
			getSerializableProperties: function() {
				var b = es.superClass.getSerializableProperties.call(this);
				return b.clickThroughEnabled = 1, b.syncSize = 1, b
			}
		});
		var Xc = z.Grid = function() {
			wp(z.Grid, this)
		};
		Bm("Grid", bf, {
			IRotatable: !1,
			_icon: "grid_icon",
			_image: _,
			getUIClass: function() {
				return yd
			},
			setRotation: function() {},
			getCellRect: function(s, h) {
				var M = this,
					U = M.s("grid.row.count"),
					H = M.s("grid.column.count");
				if(0 >= U || 0 >= H || 0 > s || s >= U || 0 > h || h >= H) return _;
				var K, R, Y, v = M.getRect(),
					Z = M.s("grid.row.percents"),
					E = M.s("grid.column.percents");
				if(ke(v, M, "grid.border", -1), Z && Z._as && (Z = Z._as), E && E._as && (E = E._as), Z && Z.length === U) {
					for(Y = 0, K = 0; s > K; K++) Y += v.height * Z[K];
					v.y += Y, v.height = v.height * Z[s]
				} else v.height = v.height / U, v.y += v.height * s;
				if(E && E.length === H) {
					for(R = 0, K = 0; h > K; K++) R += v.width * E[K];
					v.x += R, v.width = v.width * E[h]
				} else v.width = v.width / H, v.x += v.width * h;
				return jk(v, -M.s("grid.gap")), v
			}
		});
		var nl = z.Text = function() {
			wp(nl, this), this.setSize(100, 50), this.s("text", "TEXT")
		};
		Bm("Text", bf, {
			_icon: "text_icon",
			_image: "__text__",
			getUIClass: function() {
				return ll
			},
			setWidth: function(s) {
				s || (s = .001), nl.superClass.setWidth.call(this, s)
			},
			setHeight: function(F) {
				F || (F = .001), nl.superClass.setHeight.call(this, F)
			},
			toLabel: function() {
				return this._displayName || this._name || this.s("text")
			}
		}), Wi("__text__", {
			width: {
				value: 100,
				isSafeFunc: !0,
				func: function(w) {
					return w._width
				}
			},
			height: {
				value: 50,
				isSafeFunc: !0,
				func: function(L) {
					return L._height
				}
			},
			comps: [{
				type: "text",
				relative: !0,
				rect: [0, 0, 1, 1],
				text: {
					func: "style@text"
				},
				align: {
					func: "style@text.align"
				},
				vAlign: {
					func: "style@text.vAlign"
				},
				color: {
					func: "style@text.color"
				},
				font: {
					func: "style@text.font"
				},
				shadow: {
					func: "style@text.shadow"
				},
				shadowColor: {
					func: "style@text.shadow.color"
				},
				shadowBlur: {
					func: "style@text.shadow.blur"
				},
				shadowOffsetX: {
					func: "style@text.shadow.offset.x"
				},
				shadowOffsetY: {
					func: "style@text.shadow.offset.y"
				}
			}]
		});
		var Mf = z.Shape = function() {
			wp(Mf, this), this._59O = new ag
		};
		Mf.__de__ = vp, Bm("Shape", bf, {
			ms_ac: ["thickness", "closePath"],
			_icon: "shape_icon",
			_thickness: 10,
			_closePath: !1,
			getUIClass: function() {
				return Of
			},
			_22Q: function() {
				return Wp
			},
			getLength: function(x) {
				return pg(Lh(this._59O, this._58O, x, this._closePath))
			},
			getSegments: function() {
				return this._58O
			},
			toSegments: function() {
				var s = this._58O;
				return s ? new ag(s._as.slice(0)) : s
			},
			setSegments: function(X) {
				var m = this._58O;
				X = X ? An(X) ? new ag(X.slice(0)) : new ag(X._as.slice(0)) : null, (m && X && m._as.join(",") !== X._as.join(",") || m !== X) && (this._58O = X, this.fp("segments", m, X))
			},
			getPoints: function() {
				return this._59O
			},
			toPoints: function() {
				var V = this._59O;
				return new ag(V._as.slice(0))
			},
			setPoints: function(j, G) {
				var L = this,
					C = L._59O;
				j = j ? An(j) ? new ag(j.slice(0)) : new ag(j._as.slice(0)) : new ag;
				var h, p, e, E, b, u;
				G && (h = L.getPosition(), u = new Fi(L.getRotation(), 0, 0, L.getScale().x, L.getScale().y)), (C && j && C._as.join(",") !== j._as.join(",") || C !== j) && (L._59O = j, L.fs(), L.fp("points", C, j)), G && (p = L.getPosition(), e = p.x - h.x, E = p.y - h.y, b = u.tf(e, E), L.setPosition(p.x - e + b.x, p.y - E + b.y))
			},
			addPoint: function(G, x, P) {
				var $ = this.toPoints();
				$.add(G, x), this.setPoints($, P)
			},
			setPoint: function(i, L, F) {
				var V = this.toPoints();
				V.set(i, L), this.setPoints(V, F)
			},
			removePointAt: function(K) {
				var a = this.toPoints();
				a.removeAt(K), this.setPoints(a)
			},
			setWidth: function(s) {
				var G = this;
				if(1 > s && (s = 1), !G._55I && !he && G.getWidth()) {
					G._55I = 1;
					var S = G._position.x,
						n = s / G.getWidth(),
						x = G.toPoints(),
						J = new ag;
					x.each(function(o) {
						J.add({
							x: (o.x - S) * n + S,
							y: o.y,
							e: o.e
						})
					}), G.setPoints(J);
					var $ = G.s("shape.gradient.pack");
					$ && is($, [n, 0, 0, 1, S * (1 - n), 0]), G.fs(), delete G._55I
				}
				Mf.superClass.setWidth.call(G, s)
			},
			setHeight: function(P) {
				var Y = this;
				if(1 > P && (P = 1), !Y._55I && !he && Y.getHeight()) {
					Y._55I = 1;
					var v = Y._position.y,
						l = P / Y.getHeight(),
						J = Y.toPoints(),
						T = new ag;
					J.each(function(s) {
						T.add({
							x: s.x,
							y: (s.y - v) * l + v,
							e: s.e
						})
					}), Y.setPoints(T);
					var y = Y.s("shape.gradient.pack");
					y && is(y, [1, 0, 0, l, 0, v * (1 - l)]), Y.fs(), delete Y._55I
				}
				Mf.superClass.setHeight.call(Y, P)
			},
			setAnchorElevation: function(n) {
				var p = this;
				if(p._55I = !0, !he) {
					var J, U = n,
						i = p.getAnchorElevation(),
						l = p.getTall();
					J = l * (i - U), p.shiftPointsElevation(J)
				}
				Mf.superClass.setAnchorElevation.apply(p, arguments), delete p._55I
			},
			getShapeElevation: function() {
				var D = this,
					N = D._54O;
				return N - (D.getTall() || 0) * (D._anchorElevation - .5)
			},
			setAnchor: function($, G, Z) {
				var B = this;
				if(B._55I = !0, !he) {
					var e, m, f;
					"number" == typeof $ ? f = {
						x: $,
						y: G
					} : (f = $.length ? {
						x: $[0],
						y: $[1]
					} : $, Z = G);
					var g = B.getAnchor(),
						K = B.getSize();
					e = K.width * (g.x - f.x), m = K.height * (g.y - f.y), Z || B.shiftPoints(e, m);
					var o = B.getPosition()
				}
				if(Mf.superClass.setAnchor.apply(B, arguments), !he) {
					var A = B.getPosition();
					Z && B.shiftPoints(A.x - o.x + e, A.y - o.y + m)
				}
				delete B._55I
			},
			shiftPoints: function(r, Q) {
				var a = this,
					n = a.toPoints(),
					p = new ag;
				n.each(function(a) {
					p.add({
						x: a.x + r,
						y: a.y + Q,
						e: a.e
					})
				}), a.setPoints(p), a.fs()
			},
			shiftPointsElevation: function(P) {
				var t = this;
				t._59O.each(function(M) {
					M.e == _ ? M.e = P : M.e += P
				}), t.fs()
			},
			setPosition: function(m, Q) {
				var z, S = this;
				if(!S._28Q) {
					if(S._28Q = 1, !S._55I && !he) {
						z = 2 === arguments.length ? {
							x: m,
							y: Q
						} : m;
						var D = z.x - S._position.x,
							E = z.y - S._position.y;
						if(0 === D && 0 === E) return delete S._28Q, void 0;
						S._55I = 1, S.shiftPoints(D, E);
						var G = S.s("shape.gradient.pack");
						G && is(G, [1, 0, 0, 1, D, E]), delete S._55I
					}
					Mf.superClass.setPosition.apply(S, arguments), delete S._28Q
				}
			},
			fs: function() {
				this.fireShapeChange()
			},
			_70I: function() {
				var D = this;
				if(2 !== D._59O.size()) return !1;
				var u = D._58O;
				return u ? 2 === u.size() && 1 === u.get(0) && 2 === u.get(1) ? !0 : !1 : !0
			},
			fireShapeChange: function() {
				var q = this;
				if(!q._55I && !he) {
					var Z = kl(q._59O);
					Z && (q._55I = 1, q.setRect(Z), delete q._55I)
				}
				q.fp(xn, !1, !0)
			},
			getSerializableProperties: function() {
				var M = Mf.superClass.getSerializableProperties.call(this);
				return M.segments = 1, M.points = 1, M.thickness = 1, M.closePath = 1, M
			}
		});
		var Pf = z.Polyline = function() {
			wp(Pf, this), this.s({
				"shape.background": null,
				"shape.border.width": 2
			})
		};
		Bm("Polyline", Mf, {
			_icon: "polyline_icon",
			_22Q: function() {
				return on
			},
			getUIClass: function() {
				return tc
			},
			setClosePath: function() {},
			shiftPointsElevation: function() {
				var q = this;
				q._24Q || he || (q._24Q = 1, Pf.superClass.shiftPointsElevation.apply(q, arguments), delete q._24Q)
			},
			setTall: function(T) {
				var m = this;
				if(!m._24Q && !he && m.getTall()) {
					m._24Q = 1;
					var e = m._54O,
						n = T / m.getTall();
					m._59O.each(function(c) {
						c.e = c.e == _ ? e : (c.e - e) * n + e
					}), m.fs(), delete m._24Q
				}
				Pf.superClass.setTall.call(m, T)
			},
			setElevation: function(q) {
				var H = this;
				if(!H._24Q && !he) {
					H._24Q = 1;
					var L = q - H._54O;
					H._59O.each(function(c) {
						c.e == _ ? c.e = q : c.e += L
					}), H.fs(), delete H._24Q
				}
				Pf.superClass.setElevation.apply(H, arguments)
			},
			fireShapeChange: function() {
				var h = this,
					n = h._59O;
				if(!h._24Q && !he) {
					var u = n.size();
					if(u) {
						var Z = 1,
							$ = n.get(0),
							U = h._54O;
						$.e == _ && ($.e = U);
						for(var Y = $.e, J = 0; u > Z; Z++) {
							$ = n.get(Z), $.e == _ && ($.e = U);
							var v = R(Y, $.e),
								f = N(Y + J, $.e);
							Y = v, J = f - v
						}
						h._24Q = 1, h.setTall(J), h.setElevation(Y + J * h._anchorElevation), delete h._24Q
					}
				}
				Pf.superClass.fireShapeChange.apply(h, arguments)
			}
		});
		var _q = z.SubGraph = function() {
			wp(_q, this)
		};
		Bm("SubGraph", bf, {
			ISubGraph: 1,
			_image: "subGraph_image",
			_icon: "subGraph_icon",
			_8I: function() {
				_q.superClass._8I.call(this), this.eachChild(function(C) {
					mm(C) && C._8I()
				})
			}
		});
		var Ao = z.RefGraph = function() {
			wp(Ao, this)
		};
		Bm("RefGraph", es, {
			_icon: "refGraph_icon",
			getRef: function() {
				return this._ref
			},
			setRef: function(j) {
				var k = this._ref;
				this._ref = j, this.fp("ref", k, j), this._pendingUpdateFromChidlren = !0, this.updateRef()
			},
			_21I: function() {
				Ao.superClass._21I.apply(this, arguments), this.updateRef()
			},
			updateRef: function() {
				var j = this;
				if(j.clearChildrenFromDataModel(), j._ref && j._dataModel) {
					j._xhrLoadHandler && (j._xhrLoadHandler.cancel = !0);
					var d = he,
						u = j._xhrLoadHandler = function(k) {
							if(k && j._dataModel) {
								h.loadingRefGraph = !0;
								var O = j._pendingUpdateInfo = {
									needToRestore: d
								};
								d && (O.position = j.p(), O.width = j.getWidth(), O.height = j.getHeight(), O.rotation = j.getRotation(), O.anchor = j.getAnchor(), O.scale = j.getScale()), j.p(0, 0), j.setAnchor(.5, .5), j.setRotation(0), j.setScale(1, 1);
								var s = h.parse(k),
									P = j._dataModel.deserialize(s, j, {
										justDatas: !0
									});
								P.each(function(U) {
									U._refGraph = j
								}), j.checkPendingUpdateInfo(), h.loadingRefGraph = !1, h.handleRefGraphLoaded(j, P, s)
							}
						};
					h.xhrLoad(j._ref, function(D) {
						u.cancel || u(D)
					})
				}
			},
			checkPendingUpdateInfo: function() {
				var z = this,
					K = z._pendingUpdateInfo;
				if(!K) return z.onPendingUpdated && z.onPendingUpdated(), void 0;
				var i = !0;
				this.eachChild(function(C) {
					(C._pendingCheckImageJSON || C._pendingUpdateInfo) && (i = !1)
				}), i && (z._pendingUpdateInfo = null, z.updateFromChildren(), K.needToRestore && (z.setSize(K.width, K.height), z.setAnchor(K.anchor), z.setRotation(K.rotation), z.setScale(K.scale), z.p(K.position)), this.getParent() instanceof Ao && this.getParent().checkPendingUpdateInfo(), z.onPendingUpdated && z.onPendingUpdated())
			},
			getSerializableProperties: function() {
				var Z = Ao.superClass.getSerializableProperties.call(this);
				return Z.ref = 1, Z
			}
		}), z.EdgeGroup = function(x, U) {
			this._70O = x, this._siblings = U;
			for(var e, W, b = 0, a = x.size(), E = Q[$b]; a > b; b++)
				if(e = x.get(b).getStyle($b, !1), e != _) {
					E = e;
					break
				}
			E == _ && (E = !0);
			var T = h.edgeGroupAgentFunc;
			for(T && (W = T(x), W && W !== x.get(0) && (x.remove(W), x.add(W, 0))), b = 0; a > b; b++) x.get(b).s($b, E)
		}, Bm("EdgeGroup", f, {
			getEdges: function() {
				return this._70O
			},
			size: function() {
				return this._70O.size()
			},
			get: function(o) {
				return this._70O.get(o)
			},
			indexOf: function(x) {
				return this._70O.indexOf(x)
			},
			each: function(Z, s) {
				this._70O.each(Z, s)
			},
			getSiblings: function() {
				return this._siblings
			},
			eachSiblingEdge: function(K, A) {
				this._siblings.each(function(e) {
					e._70O.each(K, A)
				})
			}
		});
		var fg = function(E, S, l) {
			var F = De[E] = {
				type: E,
				action: S
			};
			if(l)
				for(var x in l) F[x] = l[x]
		};
		fg("host", function(b, W) {
			W && b.setHost(W)
		}, {
			"delete": {
				visible: function(V) {
					return V.getHost()
				},
				action: function(v) {
					v.setHost(null)
				}
			}
		}), fg("parent", function(E, w) {
			w && E.setParent(w)
		}, {
			"delete": {
				visible: function(_) {
					return _.getParent()
				},
				action: function(c) {
					c.setParent(null)
				}
			}
		}), fg("copySize", function(B, O) {
			if(O) {
				var w = O.getSize();
				B.setSize(w)
			}
		}), fg("copyRotation", function(f, M) {
			if(M) {
				var X = M.getRotation();
				f.setRotation(X)
			}
		}), fg("edge", function(A, n) {
			if(n) {
				var y = new z.Edge(A, n);
				A.dm().add(y)
			}
		});
		var Gk = "host";
		yi(h, {
			setConnectAction: fg,
			getConnectAction: function(g) {
				return g = g || Gk, De[g]
			},
			doConnectAction: function(Y, v, F) {
				F = F || Gk;
				var m = De[F];
				if(!m) return !1;
				var j = m.action;
				return j ? (j.call(null, Y, v), !0) : !1
			},
			doDeleteConnectionAction: function(z, $) {
				$ = $ || Gk;
				var I = De[$];
				if(!I || !I.delete) return !1;
				var W = I.delete.action;
				return W ? (W.call(null, z), !0) : !1
			},
			getCurrentConnectActionType: function() {
				return Gk
			},
			setCurrentConnectActionType: function(j) {
				return De[j] ? (Gk = j, !0) : !1
			}
		});
		var lf = z.JSONSerializer = function(s, T) {
			this.dm = this._dataModel = s, this._hierarchical = h.forceHierarchicalSerialization ? !0 : T == _ ? s.isHierarchicalRendering() : T
		};
		Bm("JSONSerializer", f, {
			ms_ac: ["hierarchical"],
			serialize: function(D) {
				return h.stringify(this.toJSON(), D)
			},
			toJSON: function() {
				var n = this,
					L = n.dm,
					f = L.getRoots(),
					k = n.json = {
						v: h.getVersion(),
						p: {},
						a: {},
						d: []
					},
					C = L.getSerializableAttrs();
				L.getInit() && (k.init = L.getInit()), L.getName() && (k.p.name = L.getName()), L.getBackground() && (k.p.background = L.getBackground()), L.getLayers() && (k.p.layers = L.getLayers()), k.p.autoAdjustIndex = L.isAutoAdjustIndex(), k.p.hierarchicalRendering = L.isHierarchicalRendering();
				for(var T in C) {
					var X = L.a(T);
					X !== S && n[Dk](T, X, k.a)
				}
				return Bh(k.a) && delete k.a, n._hierarchical ? f.each(n.serializeData, this) : L.each(function(S) {
					n.serializeData(S)
				}), k
			},
			isSerializable: function() {
				return !0
			},
			getProperties: function(n) {
				return n.getSerializableProperties()
			},
			getStyles: function(F) {
				return F.getSerializableStyles()
			},
			getAttrs: function(p) {
				return p.getSerializableAttrs()
			},
			serializeData: function(D) {
				var i = this;
				if(i.isSerializable(D) && !D._refGraph) {
					var k, O, H, P, K = ms(D.getClassName()) || D.getClass(),
						j = new K,
						B = {
							c: D.getClassName(),
							i: D.getId(),
							p: {},
							s: {},
							a: {}
						};
					i.json.d.push(B), k = i.getProperties(D);
					for(O in k) /^_/.test(O) ? (H = D[O], H !== j[O] && i[Dk](O.substr(1), H, B.p)) : (P = Ik(O), D[P] && (H = D[P](), H !== j[P]() && i[Dk](O, H, B.p)));
					k = i.getStyles(D);
					for(O in k) H = D.s(O), H !== j.s(O) && i[Dk](O, H, B.s);
					k = i.getAttrs(D);
					for(O in k) H = D.a(O), H !== j.a(O) && i[Dk](O, H, B.a);
					Bh(B.p) && delete B.p, Bh(B.s) && delete B.s, Bh(B.a) && delete B.a
				}
				i._hierarchical && D.getChildren().each(i.serializeData, i)
			},
			serializeValue: function(k, z, F) {
				jg(z) ? z = {
					__a: z._as
				} : z instanceof No && (z = {
					__i: z.getId()
				}), F[k] = z
			},
			deserialize: function(q, H, b) {
				var I = this,
					y = I.dm;
				y.beginTransaction(), he = !0, b = Yh(b) ? {
					setId: b
				} : b || {}, q = I.json = Ol(q) ? h.parse(q) : q, I._82I = {};
				var N = new ag,
					v = new ag,
					d = 0,
					A = q.d.length;
				if(b.justDatas || (jc(q.init) && q.init(y), y.setInit(q.init)), !b.justDatas) {
					for(var r in q.a) y.a(r, I[Il](q.a[r]));
					for(var K in q.p) y[Ah(K)](q.p[K])
				}
				for(; A > d; d++) {
					var w = q.d[d],
						Q = ms(w.c),
						W = new Q,
						x = w.i;
					b.setId && x != _ && (W._id = x), I._82I[x] = W, N.add(W), v.add(w)
				}
				for(d = 0; A > d; d++) I.deserializeData(N.get(d), v.get(d));
				return N.each(function(A) {
					H && !A.getParent() && A.setParent(H), y.add(A)
				}), he = !1, y.endTransaction(), N
			},
			deserializeData: function(z, g) {
				for(var i in g.p) z[Ah(i)](this[Il](g.p[i]));
				for(i in g.s) z.s(i, this[Il](g.s[i]));
				for(i in g.a) z.a(i, this[Il](g.a[i]))
			},
			deserializeValue: function(d) {
				if(Ki(d)) {
					var S = d.__i;
					if(S != _) return this._82I[S];
					if(S = d.__a, An(S)) return new ag(S)
				}
				return d
			}
		}), yi(uk, {
			serialize: function(z, s) {
				return new lf(this, s).serialize(z)
			},
			toJSON: function(d) {
				return new lf(this, d).toJSON()
			},
			deserialize: function(k, v, z) {
				return new lf(this).deserialize(k, v, z)
			}
		}), zf.GraphView = function(Y) {
			var k = this;
			k._24I = {}, k._34I = new ag, k._25I = {}, k._56I = {}, k._view = Co(1, k), k._canvas = Qc(k._view), k.dm(Y ? Y : new uk), this._coreInteractor = new go(this), k.setEditable(!1), k.setScrollBarVisible(h.graphViewScrollBarVisible)
		}, zl("GraphView", f, {
			ms_v: 1,
			ms_gv: 1,
			ms_bnb: 1,
			ms_tip: 1,
			ms_dm: 1,
			ms_lp: 1,
			ms_fire: 1,
			ms_sm: 1,
			_49o: 1,
			ms_txy: 1,
			_52o: 1,
			_51o: 1,
			ms_ac: [oq, fb, Bl, eq, "resettable", "editInteractor", bj, "pannable", "rectSelectable", "autoScrollZone", $q, "movableFunc", "editableFunc", "pointEditableFunc", "rectEditableFunc", "rotationEditableFunc", "anchorEditableFunc", "rectSelectBackground", "rectSelectBorderColor", "editPointSize", "editPointBorderColor", "editPointBackground", "hoverDelay"],
			_resettable: h.graphViewResettable,
			_pannable: h.graphViewPannable,
			_rectSelectable: h.graphViewRectSelectable,
			_autoScrollZone: h.graphViewAutoScrollZone,
			_rectSelectBackground: h.graphViewRectSelectBackground,
			_rectSelectBorderColor: h.graphViewRectSelectBorderColor,
			_editPointSize: h.graphViewEditPointSize,
			_editPointBorderColor: h.graphViewEditPointBorderColor,
			_editPointBackground: h.graphViewEditPointBackground,
			_scrollBarColor: Bq,
			_scrollBarSize: sr,
			_autoHideScrollBar: Vp,
			_autoMakeVisible: zs,
			getCoreInteractor: function() {
				return this._coreInteractor
			},
			getLayers: function() {
				return this._dataModel.getLayers()
			},
			setLayers: function(C) {
				this._dataModel.setLayers(C)
			},
			setEditable: function(e) {
				var m = this,
					l = m.__interactorMap__;
				if(!l) {
					var D = zf.XEditInteractor;
					l = m.__interactorMap__ = {
						scrollBar: new Ak(m),
						select: new sn(m),
						edit: D ? new D(m) : new lj(m),
						move: new Qj(m),
						"default": new El(m),
						touch: new Al(m, {
							editable: !1
						})
					}
				}
				e ? (m._uieditable = !0, m.setInteractors([l.scrollBar, l.select, l.edit, l.move, l.default, l.touch])) : (m._uieditable = !1, m.setInteractors([l.scrollBar, l.select, l.move, l.default, l.touch]))
			},
			getCanvas: function() {
				return this._canvas
			},
			_33I: function(s) {
				var R = s.getUIClass();
				return R ? new R(this, s) : _
			},
			getDataUI: function(s) {
				var d = this,
					U = d._25I[s._id];
				return U === S && (U = d._33I(s), d._25I[s._id] = U), U
			},
			getNodeRect: function(O) {
				return h.getNodeRect(this, O)
			},
			getEdgeInfo: function(d) {
				var W = this.getDataUI(d);
				return W ? (W._79o(), W._78o) : null
			},
			getEdgeSourcePosition: function(E) {
				var o = this,
					y = o.getDataUI(E),
					H = y.s,
					K = y._data._40I;
				return Te(o, K, H("edge.source.position"), H("edge.source.offset.x"), H("edge.source.offset.y"), H("edge.source.anchor.x"), H("edge.source.anchor.y"))
			},
			getEdgeTargetPosition: function($) {
				var y = this,
					K = y.getDataUI($),
					C = K.s,
					f = K._data._41I;
				return Te(y, f, C("edge.target.position"), C("edge.target.offset.x"), C("edge.target.offset.y"), C("edge.target.anchor.x"), C("edge.target.anchor.y"))
			},
			invalidateAll: function(Z) {
				var s = this;
				if(Z) {
					for(var j in s._25I) {
						var z = s._25I[j];
						z && z.dispose()
					}
					s._25I = {}, s._56I = {}, s._24I = {}, s._34I.clear(), s.redraw()
				} else s.dm().each(function(Q) {
					s.invalidateData(Q)
				})
			},
			invalidateSelection: function() {
				var q = this;
				q.sm().each(function(c) {
					q.invalidateData(c)
				})
			},
			invalidateData: function(F) {
				var t = this;
				t._24I[F._id] = F, t._21Q(F), t.iv()
			},
			_21Q: function(R) {
				var z = this,
					i = z._24I;
				if(Tk(R) && gq[R.s(rb)]) {
					var V = R.getSourceAgent();
					V && V.getAgentEdges().each(function(u) {
						i[u._id] = u
					}), V = R.getTargetAgent(), V && V.getAgentEdges().each(function(K) {
						i[K._id] = K
					}), z.iv()
				}
			},
			redraw: function(o) {
				var R = this;
				R._32I || (o ? R._34I.add(o) : (R._32I = 1, R._34I.clear()), R.iv())
			},
			each: function(d, L) {
				var Y, I, t, C = 0,
					g = this.getLayers(),
					r = this._dataModel,
					o = r._datas._as,
					i = o.length;
				if(g) {
					for(var e = g.length; e > C; C++)
						if(t = g[C], Ki(t) && (t = t.name), r.isHierarchicalRendering()) {
							var E = function(T) {
								return T._layer === t ? L ? d.call(L, T) : d(T) : void 0
							};
							if(this._dataModel.eachByHierarchical(E) === !1) return
						} else
							for(var M = 0; i > M; M++)
								if(Y = o[M], Y._layer === t && (I = L ? d.call(L, Y) : d(Y), I === !1)) return
				} else if(r.isHierarchicalRendering()) this._dataModel.eachByHierarchical(d, null, L);
				else
					for(; i > C; C++)
						if(Y = o[C], I = L ? d.call(L, Y) : d(Y), I === !1) return
			},
			reverseEach: function(Y, G) {
				var R, u, w, K, H = this._dataModel,
					O = H._layers,
					I = H._datas._as,
					J = I.length;
				if(O) {
					for(R = O.length - 1; R >= 0; R--)
						if(K = O[R], Ki(K) && (K = K.name), H.isHierarchicalRendering()) {
							var S = function(s) {
								return s._layer === K ? G ? Y.call(G, s) : Y(s) : void 0
							};
							if(H.reverseEachByHierarchical(S) === !1) return
						} else
							for(var N = J - 1; N >= 0; N--)
								if(u = I[N], u._layer === K && (w = G ? Y.call(G, u) : Y(u), w === !1)) return
				} else if(H.isHierarchicalRendering()) H.reverseEachByHierarchical(Y, null, G);
				else
					for(R = J - 1; R >= 0; R--)
						if(u = I[R], w = G ? Y.call(G, u) : Y(u), w === !1) return
			},
			getViewRect: function() {
				return this._29I
			},
			getContentRect: function() {
				var O = this,
					l = O._84I;
				if(!l) {
					var w = this.dm().a("width"),
						B = this.dm().a("height");
					w > 0 && B > 0 ? O._84I = {
						x: 0,
						y: 0,
						width: w,
						height: B
					} : (O.each(function(o) {
						O.isVisible(o) && (l = Xl(l, O.getDataUIBounds(o)))
					}), O._84I = l ? l : ih)
				}
				return O._84I
			},
			getScrollRect: function() {
				return Xl(this.getContentRect(), this._29I)
			},
			makeCenter: function(u, p, g) {
				var b = this;
				if(!b.getWidth() || !b.getHeight()) return g || Ec(b.centerData, b, [u, p, !0], 500), void 0;
				b.makeVisible(u), b.validate();
				var H = b.getDataUIBounds(u);
				if(H) {
					var J = b.getWidth(),
						L = b.getHeight(),
						$ = H.x + H.width / 2,
						c = H.y + H.height / 2,
						U = -$ * b._zoom + J / 2,
						j = -c * b._zoom + L / 2;
					b.setTranslate(U, j, p)
				}
			},
			fitData: function(k, e, n, D, Z) {
				var L = this;
				if(!L.getWidth() || !L.getHeight()) return Z || Ec(L.fitData, L, [k, e, n, D, !0], 500), void 0;
				var i = function() {
					L.makeVisible(k), L.validate();
					var J = L.getDataUIBounds(k);
					J && (J = sq(J), jk(J, n == _ ? 20 : n), L.fitRect(J, e, D))
				};
				e ? h.callWhenLoaded(i) : i()
			},
			fitContent: function(g, B, m, s) {
				var f = this;
				if(!f.getWidth() || !f.getHeight()) return s || Ec(f.fitContent, f, [g, B, m, !0], 500), void 0;
				var r = function() {
					f.validate();
					var t = sq(f.getContentRect());
					jk(t, B == _ ? 20 : B), f.fitRect(t, g, m)
				};
				g ? h.callWhenLoaded(r) : r()
			},
			fitRect: function(I, a, z) {
				var q = this,
					U = q.getWidth(),
					Y = q.getHeight(),
					n = I.x + I.width / 2,
					Z = I.y + I.height / 2,
					$ = R(U / I.width, Y / I.height),
					N = q._zoom,
					V = -n * N + U / 2,
					c = -Z * N + Y / 2;
				0 === $ || isNaN($) || (z && ($ = R(1, $)), a ? q.setTranslate(V, c, {
					finishFunc: function() {
						q.setZoom($, a)
					}
				}) : (q.setTranslate(V, c), q.setZoom($)))
			},
			toCanvas: function(R, K) {
				K = K || this._zoom, this.validateImpl();
				var m = this,
					M = m.getContentRect();
				M.width || (M.width = 10), M.height || (M.height = 10);
				var r = Qc(),
					t = M.x * K,
					z = M.y * K,
					E = M.width * K,
					Q = M.height * K;
				Mj(r, E, Q, 1);
				var P = wc(r);
				return R = R || this._dataModel.getBackground(), R && jo(P, 0, 0, E, Q, R), Zg(P, -t, -z), P.scale(K, K), m._42(P), P.restore(), r
			},
			toDataURL: function(e, u, l) {
				return this.toCanvas(e, l).toDataURL(u || "image/png", 1)
			},
			getClipBounds: function() {
				return this._74O
			},
			_42: function(I, n) {
				var H, v, V = this;
				V._93db(I, n), V.each(function(U) {
					V._56I[U._id] && (H = V.getDataUI(U), H && (v = H._79o(), z.HtmlNode && U instanceof z.HtmlNode ? H._42(I) : (!n || mh(n, v)) && H._42(I)))
				}), V._92db(I, n)
			},
			validateImpl: function() {
				var C, w, O, m, b, l = this,
					v = l.tx(),
					y = l.ty(),
					E = l._zoom,
					a = l._canvas,
					H = this.getWidth(),
					V = this.getHeight(),
					k = l._29I,
					G = {
						x: -v / E,
						y: -y / E,
						width: H / E,
						height: V / E
					},
					B = {},
					c = l._34I,
					o = l._24I,
					I = l._32I,
					M = l._23I;
				l._24I = {}, (H !== a.clientWidth || V !== a.clientHeight) && (Mj(a, H, V), I = 1), I || td(G, k) || (I = 1), l._29I = G, l.each(function(Y) {
					w = Y._id;
					var y = B[w] = l.isVisible(Y);
					y !== l._56I[w] && (o[w] = Y, O = l.getDataUI(o[w]), O && O._84o(y), l._84o(Y, y))
				}, l);
				for(w in o) O = l.getDataUI(o[w]), O && (!I && l._56I[w] && (b = O._79o(), b && c.add(b)), O.invalidate()), l._83I = 1;
				if(l._56I = B, !I)
					for(w in o) B[w] && (O = l.getDataUI(o[w]), O && (b = O._79o(), b && c.add(b)));
				if(I ? m = G : (c.each(function(K) {
						mh(G, K) && (m = Xl(m, K))
					}), m && (jk(m, N(1, 1 / E)), m.x = X(m.x * E) / E, m.y = X(m.y * E) / E, m.width = q(m.width * E) / E, m.height = q(m.height * E) / E, m = ns(G, m))), l._74O = m, m) {
					C = wc(a);
					var Y = m.x,
						z = m.y,
						e = m.width,
						n = m.height;
					Y = Math.floor((Y * E + v) * dg), z = Math.floor((z * E + y) * dg), e = Math.ceil(e * E * dg) + 1, n = Math.ceil(n * E * dg) + 1, C.beginPath(), C.rect(Y, z, e, n), C.clip(), C.clearRect(Y, z, e, n), bi(C, v, y, E), l._42(C, m), C.restore(), delete l._74O
				}
				if(c.clear(), delete l._32I, M && H > 0 && V > 0) {
					var O = l.getDataUI(M);
					if(O) {
						var b = O._79o(),
							D = l._29I,
							P = D.x,
							j = D.y,
							h = D.width,
							f = D.height,
							E = l._zoom;
						b && !mh(b, D) && (b.x + b.width < P && l.tx(-b.x * E), b.x > P + h && l.tx(-(b.x + b.width - h) * E), b.y + b.height < j && l.ty(-b.y * E), b.y > j + f && l.ty(-(b.y + b.height - f) * E))
					}
					delete l._23I
				}
				l._83I && (delete l._83I, delete l._84I), l._98O(), Bh(l._24I) || Ec(l.iv, l)
			},
			isScrollBarVisible: function() {
				return !!this._79O
			},
			setScrollBarVisible: function(B) {
				var T = this;
				B !== T.isScrollBarVisible() && (B ? (Yb(T._view, T._79O = ff()), Yb(T._79O, T._27I = ff()), Yb(T._79O, T._28I = ff())) : (Cj(T._79O), delete T._79O, delete T._27I, delete T._28I), T.fp("scrollBarVisible", !B, B))
			},
			showScrollBar: function() {
				var h = this;
				h._79O && (h._85I || (E(function() {
					h._86I()
				}, wq), h.iv()), h._85I = new Date)
			},
			_86I: function() {
				var F = this;
				if(F._85I) {
					var b = new Date,
						u = b.getTime();
					u - F._85I.getTime() >= wq ? (delete F._85I, F.iv()) : E(function() {
						F._86I()
					}, wq)
				}
			},
			_98O: function() {
				var x = this,
					F = this._27I,
					c = this._28I;
				if(x._79O) {
					if(x._autoHideScrollBar && !x._85I) return F.style.visibility = Ji, c.style.visibility = Ji, void 0;
					var V = x.getScrollBarColor(),
						P = x._zoom,
						z = x.getScrollBarSize(),
						d = x.getViewRect(),
						H = x.getScrollRect(),
						X = d.height * P,
						k = H.height * P,
						Q = d.width * P - z - 2,
						E = X * ((d.y - H.y) * P / k),
						B = X * (X / k),
						w = F.style;
					k - .5 > X ? (ee > B && (E = E + B / 2 - ee / 2, 0 > E && (E = 0), E + ee > X && (E = X - ee), B = ee), Pm(F, Q, E, z, B), w.visibility = be, w.background = V, w.borderRadius = z / 2 + hh) : w.visibility = Ji;
					var v = d.width * P,
						i = H.width * P,
						E = d.height * P - z - 2,
						Q = v * ((d.x - H.x) * P / i),
						p = v * (v / i),
						w = c.style;
					i - .5 > v ? (ee > p && (Q = Q + p / 2 - ee / 2, 0 > Q && (Q = 0), Q + ee > v && (Q = v - ee), p = ee), Pm(c, Q, E, p, z), w.visibility = be, w.background = V, w.borderRadius = z / 2 + hh) : w.visibility = Ji
				}
			},
			setDataModel: function(z) {
				var i = this,
					u = i._dataModel,
					r = i._selectionModel;
				u !== z && (u && (u.ump(i.handleDataModelPropertyChange, i), u.umm(i.handleDataModelChange, i), u.umd(i.handleDataPropertyChange, i), u.removeIndexChangeListener(i._75O, i), u.removeHierarchyChangeListener(i.handleHierarchyChange, i), r || u.sm().ums(i.handleSelectionChange, i)), i._dataModel = z, z.mp(i.handleDataModelPropertyChange, i), z.mm(i.handleDataModelChange, i), z.md(i.handleDataPropertyChange, i), z.addIndexChangeListener(i._75O, i), z.addHierarchyChangeListener(i.handleHierarchyChange, i), r ? r._21I(z) : z.sm().ms(i.handleSelectionChange, i), i.invalidateAll(!0), i.fp(qi, u, z), i._canvas.style.background = z.getBackground() || "")
			},
			getLayersInfo: function() {
				if(this._layersInfo === S) {
					var y = this.getLayers();
					y ? (this._layersInfo = {}, y.forEach(function(z) {
						var k = Ki(z) ? z.name : z;
						this._layersInfo[k] = z
					}, this)) : this._layersInfo = null
				}
				return this._layersInfo
			},
			updateLayers: function() {
				this._layersInfo = S, this.invalidateSelection(), this.redraw()
			},
			handleDataModelPropertyChange: function(y) {
				if("background" === y.property) {
					var U = this._canvas.style.background,
						O = y.newValue || "";
					this._canvas.style.background = O, this.fp("canvasBackground", U, O)
				} else "a:width" === y.property || "a:height" === y.property ? (this._83I = 1, this.redraw()) : "layers" === y.property ? this.updateLayers() : "hierarchicalRendering" === y.property && this.redraw()
			},
			handleDataPropertyChange: function(H) {
				this.dm().isHierarchicalRendering() && "parent" === H.property && H.data.hasChildren() && this.redraw(), this.invalidateData(H.data)
			},
			onPropertyChanged: function(g) {
				var t = this,
					Y = g.property;
				if(t.redraw(), "zoom" === Y) {
					var S = t.sm().getSelection();
					S.size() && S.each(function(j) {
						j.invalidate()
					})
				}
				Bd[Y] ? t.showScrollBar() : Y === bj && t.onCurrentSubGraphChanged(g)
			},
			onCurrentSubGraphChanged: function() {
				this.sm().cs(), this.reset()
			},
			handleDataModelChange: function(M) {
				var x = this,
					v = M.kind,
					l = M.data;
				if(x._83I = 1, "add" === v) x.invalidateData(l), Tk(l) && l.getEdgeGroup() && l.getEdgeGroup().eachSiblingEdge(x.invalidateData, x);
				else if(v === So) {
					x._21Q(l);
					var m = l._id,
						I = x._25I[m];
					if(I) {
						if(x._56I[m]) {
							var U = I._79o();
							U && x.redraw(U)
						}
						I.dispose(), delete x._25I[m], delete x._24I[m], delete x._56I[m]
					}
					l === x._currentSubGraph && x.setCurrentSubGraph(_)
				} else v === gj && (x.invalidateAll(!0), x.setCurrentSubGraph(_))
			},
			_75O: function(U) {
				this.invalidateData(U.data)
			},
			handleHierarchyChange: function(P) {
				this.dm().isHierarchicalRendering() && P.data.hasChildren() && this.redraw(), this.invalidateData(P.data)
			},
			adjustIndex: function(M) {
				var w = this;
				if(w.isVisible(M)) {
					for(var z = M; z._parent && w.isVisible(z._parent);) z = z._parent;
					z && z !== M && w._dataModel.adjustIndex(z), w._dataModel.adjustIndex(M)
				}
			},
			getImage: function(p) {
				return p.getImage()
			},
			getSelectWidth: function(W) {
				return W.s("select.width")
			},
			isSelectable: function(_) {
				if(!this._clickThroughChecking && _.getParent() instanceof es && _.getParent().isSyncSize()) return !1;
				var x = this.getLayersInfo();
				if(x) {
					var M = x[_._layer];
					if(M && M.selectable === !1) return !1
				}
				return _.s("2d.selectable") && this.sm().isSelectable(_)
			},
			isMovable: function(S) {
				var k = this;
				if(Tk(S) && S.getStyle(rb) !== re) return !1;
				var e = this.getLayersInfo();
				if(e) {
					var c = e[S._layer];
					if(c && c.movable === !1) return !1
				}
				return S.s("2d.movable") ? k._movableFunc ? k._movableFunc(S) : !0 : !1
			},
			isEditable: function(y) {
				var $ = this;
				if(z._uiSerializing) return $._uieditable;
				if(!$._editInteractor || !$.isSelected(y)) return !1;
				if(Go(y)) {
					var h = $.getDataUI(y);
					if(!h || h._88I) return !1
				}
				if(Tk(y) && y.getStyle(rb) !== re) return !1;
				var _ = this.getLayersInfo();
				if(_) {
					var n = _[y._layer];
					if(n && n.editable === !1) return !1
				}
				return y.s("2d.editable") ? $._editableFunc ? $._editableFunc(y) : !0 : !1
			},
			handleDelete: function() {
				this._editInteractor && (this._editInteractor.handleDelete ? this._editInteractor.handleDelete() : this.removeSelection())
			},
			isPointEditable: function(b) {
				return mm(b) && 0 !== b.getRotation() ? !1 : this._pointEditableFunc ? this._pointEditableFunc(b) : !0
			},
			isRectEditable: function(V) {
				return this._rectEditableFunc ? this._rectEditableFunc(V) : !0
			},
			isAnchorEditable: function(m) {
				return this._anchorEditableFunc ? this._anchorEditableFunc(m) : !0
			},
			isRotationEditable: function(P) {
				return P.setRotation && P.IRotatable !== !1 ? this._rotationEditableFunc ? this._rotationEditableFunc(P) : !0 : !1
			},
			getRotationPoint: function(U) {
				var G = U.getAnchor(),
					x = U.getScale(),
					M = this._zoom,
					D = Jc(U.getRotation(), 0, -U.getHeight() * x.y * G.y - (x.y < 0 ? -1 : 1) * (k ? 32 : 16) / M),
					L = U.p();
				return D.x += L.x, D.y += L.y, D
			},
			getLogicalPoint: function(n) {
				var z = this;
				return qg(n, z._canvas, z.tx(), z.ty(), z._zoom, z._zoom)
			},
			getSelectedDataAt: function(W) {
				var u = this;
				return this.getDataAt(W, function(r) {
					return u.isSelected(r)
				})
			},
			getDataInfoAt: function(o, I, Z) {
				var x, A = this.lp(o),
					B = this.getDataAt(A, I, Z);
				if(B) {
					var R = this.getDataUI(B);
					x = {
						data: B,
						ui: R
					};
					var Q = R._38o;
					if(Q) {
						var H = Q.icons;
						for(var z in H) {
							var J = H[z],
								r = Q.rects[z];
							if(r)
								for(var k = Vo(J.names, B, this), D = k ? k.length : 0, G = r.rotation, y = 0; D > y; y++) {
									var L = k[y],
										e = r[y];
									if(Qf(e, A, G)) return x.part = "icons", x.icon = L, x.rect = e, x.index = y, x.rotation = G, x
								}
						}
					}
					if(this.isNoteVisible(B)) {
						if(R.note2Info && Qf(R.note2Info.clickRect, A, _, R.note2Info.scale)) return x.part = "note2", x;
						if(R.noteInfo && Qf(R.noteInfo.clickRect, A, _, R.noteInfo.scale)) return x.part = "note", x
					}
					if(this.isLabelVisible(B)) {
						if(R.label2Info && Qf(R.label2Info.rect, A, R.label2Info.rotation, R.label2Info.scale)) return x.part = "label2", x;
						if(R.labelInfo && Qf(R.labelInfo.rect, A, R.labelInfo.rotation, R.labelInfo.scale)) return x.part = "label", x
					}
					if(B.isInRect && B.isInRect(A)) return x.part = "rect", x
				}
				return x
			},
			getDataAt: function(l, a, $) {
				l.target && (l = this.lp(l));
				var h, r = this._zoom;
				return this.reverseEach(function(U) {
					return(a ? a(U) : this.isSelectable(U)) && this.rectIntersects(U, Ye(l.x, l.y, $, r)) ? (h = U, !1) : void 0
				}, this), h
			},
			getIconInfoAt: function(c, Y) {
				var R = this;
				if(c.target && (c = R.lp(c)), Y || (Y = R.getDataAt(c)), Y) {
					var X = R.getDataUI(Y);
					if(X && X._38o) {
						var y, O = X._38o,
							g = new ag;
						for(y in O.icons) g.add(y);
						for(var e = g.size() - 1; e >= 0; e--) {
							y = g.get(e);
							for(var W = O.rects[y], U = W.rotation, G = W.length - 1; G >= 0; G--) {
								var f = W[G],
									k = f.width,
									B = f.height,
									C = {
										x: c.x - f.x - k / 2,
										y: c.y - f.y - B / 2
									};
								U != _ && (C = Jc(-U, C.x, C.y));
								var f = {
									x: -k / 2,
									y: -B / 2,
									width: k,
									height: B
								};
								if(Qf(f, C)) return {
									key: y,
									index: G,
									name: O.icons[y].names[G],
									rect: W[G],
									point: c,
									rotation: U,
									relativeRect: f,
									relativePoint: C,
									data: Y
								}
							}
						}
					}
				}
				return _
			},
			getDatasInRect: function(P, I, c) {
				c === S && (c = 1);
				var j = this,
					t = new ag;
				return j.reverseEach(function(v) {
					c && !j.isSelectable(v) || (I ? j.rectIntersects(v, P) : j.rectContains(v, P)) && t.add(v)
				}), t
			},
			moveSelection: function(I, R) {
				var d = this;
				d.dm().beginTransaction(), zj(d.sm().toSelection(d.isMovable, d), I, R), d.dm().endTransaction()
			},
			moveDatas: function(q, Y, R) {
				var D = this;
				D.dm().beginTransaction(), q instanceof ag || (q = new ag(q)), zj(q, Y, R), D.dm().endTransaction()
			},
			getDataUIBounds: function(W) {
				var U = this.getDataUI(W);
				return U ? U._79o() : _
			},
			drawData: function(I, x) {
				var a = this.getDataUI(x);
				a && (a._79o(), a._42(I)), x instanceof z.Block && x.eachChild(function(s) {
					this.drawData(I, s)
				}, this)
			},
			getBoundsForGroup: function(w) {
				return w.s(Wd) ? this.getDataUIBounds(w) : _
			},
			rectIntersects: function(A, v) {
				this.validate();
				var C = _;
				if(this._56I[A._id]) {
					var L = this._25I[A._id];
					if(L) {
						var j = L._79o();
						if(tn(v, j)) C = !0;
						else if((v = ns(v, j)) && (L.rectIntersects && (C = L.rectIntersects(v)), C == _)) {
							if(!A.s("pixelPerfect")) return !0;
							var c = v.x,
								Y = v.y,
								P = v.width,
								z = v.height,
								w = this._zoom,
								t = h.hitMaxArea,
								I = P * z * w * w;
							if(I > t) {
								var r = Math.sqrt(t / I);
								w *= r
							}
							P *= w, z *= w, 2 > P && (P = 2), 2 > z && (z = 2), c *= w, Y *= w;
							var g = Xq(P, z);
							Zg(g, -c, -Y), g.scale(w, w), this._drawForChecking = !0, this.drawData(g, A), this._drawForChecking = !1;
							try {
								for(var Q = 0, b = g.getImageData(0, 0, P, z).data; Q < b.length; Q += 4)
									if(0 !== b[Q + 3]) {
										C = !0;
										break
									}
								g.restore()
							} catch(u) {
								Zm = _, C = !1
							}
						}
					}
				}
				return C ? !0 : !1
			},
			rectContains: function(t, u) {
				if(this._56I[t._id]) {
					var I = this._25I[t._id];
					if(I) return tn(u, I._79o())
				}
				return !1
			},
			reset: function() {
				this.setZoom(1), this.setTranslate(0, 0)
			},
			handleKeyDown: function(q) {
				if(!h.isInput(q.target)) {
					var p = this,
						y = p._focusData,
						$ = y && p._25I[y._id],
						_ = 0,
						A = p._dataModel._datas;
					if(!(y && y._enabled && y._editable && $ && $.onKeyDown && $.onKeyDown(q) === !0))
						if(9 === q.keyCode && (y && (_ = A.indexOf(y), Tm(q) ? -1 === --_ && (_ = 0) : ++_ === A.size() && (_ = 0)), p._focusData = y = A.get(_), p.sm().setSelection(y)), pq(q) ? p.selectAll() : ec(q) && p.isResettable() && p.reset(), p.sm().isEmpty()) {
							if(p._editing) return;
							var j = p.tx(),
								D = p.ty(),
								u = !1,
								f = Tm() ? 100 : 10;
							pi(q) && (j -= f, u = !0), xm(q) && (D -= f, u = !0), lb(q) && (j += f, u = !0), Qh(q) && (D += f, u = !0), u && p.setTranslate(j, D)
						} else {
							Hg(q) && p.handleDelete(q);
							var x = Tm() ? 10 : 1;
							pi(q) && (p.moveSelection(-x, 0), p.fi({
								kind: "moveLeft"
							})), xm(q) && (p.moveSelection(0, -x), p.fi({
								kind: "moveUp"
							})), lb(q) && (p.moveSelection(x, 0), p.fi({
								kind: "moveRight"
							})), Qh(q) && (p.moveSelection(0, x), p.fi({
								kind: "moveDown"
							}))
						}
				}
			},
			handleScroll: function(_, R) {
				Aj(_);
				var X = this.lp(_);
				R > 0 ? this.scrollZoomIn(X) : 0 > R && this.scrollZoomOut(X)
			},
			handlePinch: function(f, _, J) {
				this._68I || (_ > J ? this.pinchZoomIn(f) : this.pinchZoomOut(f))
			},
			checkDoubleClickOnNote: function(C, K) {
				var U = this,
					$ = U.lp(C),
					G = U.getDataUI(K),
					I = G.note2Info;
				return I && K.s("note2.toggleable") && Qf(I.clickRect, $) ? (K.s(sl, !K.s(sl)), U.fi({
					kind: "toggleNote2",
					event: C,
					data: K
				}), !0) : (I = G.noteInfo, I && K.s("note.toggleable") && Qf(I.clickRect, $) ? (K.s(cp, !K.s(cp)), U.fi({
					kind: "toggleNote",
					event: C,
					data: K
				}), !0) : !1)
			},
			_84o: function() {},
			isNoteVisible: function() {
				return this._zoom > .15
			},
			isLabelVisible: function() {
				return this._zoom > .15
			},
			isEditVisible: function() {
				return this._zoom > .15
			},
			autoScroll: function(y, K) {
				var q = this,
					u = q.getAutoScrollZone(),
					s = u / q.getZoom(),
					b = u / 4,
					w = q._29I,
					U = q.lp(y),
					p = {
						x: q.tx(),
						y: q.ty()
					};
				return U && u > 0 && w && (U.x - w.x < s ? q.translate(b, 0) : w.x + w.width - U.x < s && q.translate(-b, 0), U.y - w.y < s ? q.translate(0, b) : w.y + w.height - U.y < s && q.translate(0, -b)), p.x = q.tx() - p.x, p.y = q.ty() - p.y, K && (K.x += p.x, K.y += p.y), p
			},
			getMoveMode: function(w, Y) {
				var t = Y.s("2d.move.mode");
				return t ? t : oi["88"] ? "x" : oi["89"] ? "y" : "xy"
			},
			getSerializableProperties: function() {
				return {
					scrollBarColor: 1,
					scrollBarSize: 1,
					autoMakeVisible: 1,
					autoHideScrollBar: 1,
					editable: 1,
					resettable: 1,
					pannable: 1,
					rectSelectable: 1,
					autoScrollZone: 1,
					visibleFunc: 1,
					movableFunc: 1,
					editableFunc: 1,
					pointEditableFunc: 1,
					rectEditableFunc: 1,
					anchorEditableFunc: 1,
					rotationEditableFunc: 1,
					rectSelectBackground: 1,
					rectSelectBorderColor: 1,
					editPointSize: 1,
					editPointBorderColor: 1,
					editPointBackground: 1,
					hoverDelay: 1,
					dataModel: 1,
					selectionModel: 1,
					currentSubGraph: 1,
					zoom: 1,
					translateX: 1,
					translateY: 1
				}
			},
			serializeProperty: function(A, N, s) {
				var i = this;
				return "currentSubGraph" === N ? {
					__i: A.getId()
				} : s.serializeProperty(A, N, i)
			},
			deserializeProperty: function(o, K, i) {
				var g = this;
				if("currentSubGraph" === K) {
					var D = g.dm(),
						C = D.__idMap;
					return C[o.__i]
				}
				return i.deserializeProperty(o, K, g)
			},
			setDefaultCursor: function(o, a) {
				this._defaultCursor = o, a !== !1 && this.setCursor(o)
			},
			setCursor: function(B) {
				"default" === B && (B = this._defaultCursor || B);
				var A = this.getView().style;
				A.cursor = B, A.cursor = "-webkit-" + B, A.cursor = "-moz-" + B
			}
		});
		var sp = function(l, j) {
			var e = this;
			e.gv = l, e.s = function(b) {
				return j.getStyle(b)
			}, e._data = j, e._87I = new ag
		};
		xh(sp, f, {
			_6I: _,
			ms_icons: 1,
			_84o: function() {},
			dispose: function() {},
			isShadowed: function() {
				return this.s("shadow") || this.gv.isSelected(this._data) && "shadow" === this.s("select.type")
			},
			getSelectWidth: function() {
				var C = this,
					Y = C.gv.isSelected(C._data);
				return !Y || C.isShadowed() ? 0 : C.gv.getSelectWidth(C._data)
			},
			getBodyColor: function(X) {
				var U = this._data,
					o = this.gv.getBodyColor(U);
				return o ? o : X ? U.getStyle(X) : _
			},
			_2Q: function(i) {
				return this.s(i)
			},
			_1Q: function(Q, e, O, V) {
				var l = this.s,
					t = l(e + ".dash.color");
				Q.strokeStyle = t, Q.lineWidth = O, Q.stroke(), l(e + ".dash.3d") && Ud(Q, t, l(e + ".dash.3d.color"), O, this.gv._zoom, l(e + ".dash.3d.accuracy")), Rj(Q, V)
			},
			invalidate: function() {
				this._6I = _
			},
			_79o: function() {
				var k = this;
				if(!k._6I) {
					k.labelInfo = k.label2Info = k.noteInfo = k.note2Info = k._38o = _, k._87I.clear(), k._3O();
					var w = k._data,
						t = k.gv;
					k._55O = t.isEditable(w) ? {
						_42O: t.isRectEditable(w),
						_43O: t.isPointEditable(w),
						_56O: t.isRotationEditable(w)
					} : _, k._6I = k._81o()
				}
				return k._6I
			},
			_3O: function() {},
			getPosition: function() {
				return ih
			},
			_68o: function(p, h) {
				p && this._87I.add(vb(p, h))
			},
			_81o: function() {
				var x = this,
					c = x.s;
				x._24O(Cq, "getLabel"), x._24O(ks, "getLabel2"), x._26O(ef, "getNote"), x._26O(hf, "getNote2"), x._15O(), x._55O && x._48O();
				var D;
				if(x._87I.each(function(p) {
						D = Xl(D, p)
					}), D && x.isShadowed()) {
					var E = sq(D);
					E.x += c("shadow.offset.x"), E.y += c("shadow.offset.y"), jk(E, c("shadow.blur")), D = Xl(D, E)
				}
				return x._87I.clear(), D
			},
			_42: function(c) {
				var i = this,
					P = i._data,
					O = i.gv,
					k = i.s,
					t = k("opacity"),
					q = this.isShadowed();
				if(q) {
					var F = c.shadowOffsetX,
						L = c.shadowOffsetY,
						N = c.shadowBlur,
						Q = c.shadowColor,
						U = O.getZoom();
					c.shadowOffsetX = k("shadow.offset.x") * U, c.shadowOffsetY = k("shadow.offset.y") * U, c.shadowBlur = k("shadow.blur") * U, c.shadowColor = k("select.color")
				}
				if(t != _) {
					var x = c.globalAlpha;
					c.globalAlpha = t
				}
				i._80o(c), O.isLabelVisible(P) && ((!O._drawForChecking || k("label.selectable")) && $j(c, i.labelInfo), (!O._drawForChecking || k("label2.selectable")) && $j(c, i.label2Info)), O.isNoteVisible(P) && (Sf(c, i.noteInfo), Sf(c, i.note2Info)), i._99O(c), t != _ && (c.globalAlpha = x), q && (c.shadowOffsetX = F, c.shadowOffsetY = L, c.shadowBlur = N, c.shadowColor = Q)
			},
			_80o: function() {},
			_47O: function() {},
			_24O: function(A, z) {
				var O = this,
					x = O._data,
					H = O.gv,
					G = O.s,
					D = H[z](x);
				if(D != _) {
					var K = G(A + ".scale"),
						y = G(A + ".max"),
						f = G(A + ".position"),
						q = O[A + "Info"] = {
							label: D,
							scale: K,
							color: H[z + "Color"](x),
							font: G(A + ".font"),
							opacity: G(A + ".opacity"),
							align: G(A + ".align"),
							rotation: O.getRotation(G(A + ".rotation"), !1, f),
							background: H[z + "Background"](x)
						},
						l = tg(q, D);
					y > 0 && y < l.width && (q.labelWidth = l.width, l.width = y), 1 !== K && (l.width *= K, l.height *= K);
					var d = O.getPosition(f, G(A + ".offset.x"), G(A + ".offset.y"), l, G(A + ".position.fixed"));
					if(l.x = d.x - l.width / 2, l.y = d.y - l.height / 2, O._68o(q.rect = l, q.rotation), 1 !== K) {
						var C = l.width / K,
							i = l.height / K;
						q.rect = {
							x: d.x - C / 2,
							y: d.y - i / 2,
							width: C,
							height: i
						}
					}
				}
			},
			_26O: function(S, i) {
				var C = this,
					f = C.gv,
					O = C._data,
					c = C.s,
					W = f[i](O);
				if(W != _) {
					var b, u, D = c(S + ".scale"),
						x = C[S + "Info"] = {
							note: W,
							scale: D,
							data: O,
							view: f,
							expanded: c(S + ".expanded"),
							font: c(S + ".font"),
							color: c(S + ".color"),
							opacity: c(S + ".opacity"),
							align: c(S + ".align"),
							icon: c(S + ".icon"),
							backgroundImage: c(S + ".backgroundImage"),
							borderWidth: c(S + ".border.width"),
							borderColor: c(S + ".border.color"),
							background: f[i + "Background"](O)
						},
						V = C.getPosition(c(S + ".position"), c(S + ".offset.x"), c(S + ".offset.y")),
						e = V.x,
						k = V.y;
					if(x.expanded) {
						var Z, p = c(S + ".max"),
							F = c(S + ".backgroundImage");
						F ? (F = Ui(F), Z = {
							width: ui(F, O),
							height: Hk(F, O)
						}) : Z = tg(x, W), Z.width += 6, Z.height += 2, p > 0 && p < Z.width && (x.labelWidth = Z.width, Z.width = p), b = Z.width, u = Z.height + 8, x.clickRect = {
							x: e - b * D / 2,
							y: k - u * D,
							width: b * D,
							height: u * D * Z.height / u
						}
					} else {
						var N = c(S + ".icon");
						N ? (N = Ui(N), b = ui(N, O), u = Hk(N, O)) : (b = 12, u = 18), x.clickRect = {
							x: e - b * D / 2,
							y: k - u * D,
							width: b * D,
							height: u * D
						}
					}
					x.rect = {
						x: e - b / 2,
						y: k - u * D / 2 - u / 2,
						width: b,
						height: u
					};
					var L = q(x.borderWidth / 2) * D;
					C._68o({
						x: e - b * D / 2 - L,
						y: k - u * D - L,
						width: b * D + 2 * L,
						height: u * D + 2 * L
					})
				}
			},
			_48O: function() {},
			_99O: function(E) {
				var I = this,
					Q = I._38o;
				if(Q) {
					var A = I.gv,
						Z = I._data,
						L = Q.icons;
					for(var F in L) {
						var r = L[F],
							e = Q.rects[F];
						if(e) {
							var T = Vo(r.opacity, Z, A),
								f = Vo(r.names, Z, A),
								k = f ? f.length : 0,
								n = e.rotation;
							if(T != _) {
								var z = E.globalAlpha;
								E.globalAlpha *= T
							}
							for(var g = 0; k > g; g++) {
								var v = f[g],
									y = Ui(v),
									J = e[g];
								if(n) {
									var j = J.x + J.width / 2,
										a = J.y + J.height / 2;
									E.save(), Zg(E, j, a), lo(E, n), Zg(E, -j, -a)
								}
								yq(E, y, Vo(r.stretch, Z, A), J.x, J.y, J.width, J.height, I._data, I.gv), n && E.restore()
							}
							T != _ && (E.globalAlpha = z)
						}
					}
				}
			}
		});
		var kc = function(D, v) {
			wp(kc, this, [D, v])
		};
		xh(kc, sp, {
			_checkEmptyRect: !0,
			_40O: function(J, o) {
				var b = this,
					m = b.s,
					K = J.rect;
				(J.borderColor = b.gv.getBorderColor(b._data)) && (J.borderType = m("border.type"), J.borderWidth = m("border.width"), J.borderPadding = m("border.padding"), o = N(o, J.borderPadding + J.borderWidth / 2));
				var v = b._data.getScale(),
					R = N(1, N(d(v.x), d(v.y)));
				if(J.selectWidth = b.getSelectWidth()) {
					var W = b.gv._zoom;
					J.selectType = m("select.type"), J._97o = m("select.color"), J.selectPadding = m("select.padding"), o = N(o, (J.selectPadding + J.selectWidth / 2 / W) / R)
				}
				o > 0 && (o *= R, K = sq(K), jk(K, o)), b._68o(K)
			},
			_39O: function(g, I) {
				var F, E = this,
					o = I.rect;
				if(I.borderWidth > 0 && (F = I.borderPadding, g.strokeStyle = I.borderColor, g.lineWidth = I.borderWidth, Zn(g, I.borderType, {
						x: o.x - F,
						y: o.y - F,
						width: o.width + 2 * F,
						height: o.height + 2 * F
					}), g.stroke()), I.selectWidth > 0) {
					var V = E.gv._zoom;
					if(F = I.selectPadding, g.strokeStyle = I._97o, g.lineWidth = I.selectWidth / V, I.rotation != _) {
						g.save(), g.translate(I.position.x, I.position.y), g.rotate(I.rotation);
						var c = E._data,
							a = c.getWidth(),
							z = c.getHeight(),
							H = I.scale,
							$ = I.anchor;
						o = {
							x: H.x * -a * $.x,
							y: H.y * -z * $.y,
							width: H.x * a,
							height: H.y * z
						}
					}
					Zn(g, I.selectType, {
						x: o.x - F,
						y: o.y - F,
						width: o.width + 2 * F,
						height: o.height + 2 * F
					}), I.rotation != _ && g.restore(), g.stroke()
				}
			},
			_3O: function() {
				var t = this,
					U = t.s,
					B = t._data,
					S = B.getStyle(xn),
					G = t.getBodyColor(),
					v = t._83o = S ? {
						shape: S,
						_53o: t.getBodyColor("shape.background"),
						_27Q: Ui(U("shape.repeat.image"), G),
						shapeGradientPack: U("shape.gradient.pack"),
						_54o: U("shape.border.width"),
						_55o: U("shape.border.color"),
						_56o: U("shape.border.3d"),
						_57o: U("shape.border.3d.color"),
						_58o: U("shape.border.3d.accuracy"),
						shapeGradient: U("shape.gradient"),
						_59o: U("shape.gradient.color"),
						_60o: U("shape.border.pattern"),
						_61o: U("shape.border.cap"),
						_62o: U("shape.border.join"),
						bodyColor: G
					} : {
						img: Ui(t.gv.getImage(B), G),
						bodyColor: G,
						stretch: U("image.stretch")
					};
				if(e && !w);
				else {
					v.rect = B.getRect(), v.position = B.p(), v.scale = B.getScale(), v.anchor = B.getAnchor(), v.rotation = B.getRotation(), S === Qe && (v._63o = U("shape.depth"));
					var x = 0;
					if(S) x = Do(_, v._54o / 2, v._62o), t.s("shape.dash") && (x = N(x, (t.s("shape.dash.width") || v._54o) / 2));
					else if(v.img && v.img.boundExtend)
						if(x = Vo(v.img.boundExtend, B, t.gv), v.img.boundExtendAbsolute) {
							var W = B.getScale();
							x /= t.gv._zoom * N(1, N(d(W.x), d(W.y)))
						} else if(!Vo(v.img.fitSize, B, t.gv)) {
						var u = Vo(v.img.width, B, t.gv),
							A = Vo(v.img.height, B, t.gv);
						x *= N(B.getWidth() / u, B.getHeight() / A)
					}
					t._40O(v, x);
					var h = U("clip.percentage");
					if(1 > h && (0 > h && (h = 0), v.clipRect = ln(B.getAnchorRect(), U("clip.direction"), h)), S) {
						var X = U("shape.fill.clip.percentage");
						1 > X && (0 > X && (X = 0), v.shapeClipRect = ln(B.getAnchorRect(), U("shape.fill.clip.direction"), X))
					}
				}
			},
			getPosition: function(M, i, x, g) {
				var S = Uc(M, this._83o.rect, g);
				return S.x += i, S.y += x, S
			},
			_80o: function(T) {
				var c = this,
					m = c.s,
					F = c.gv,
					Y = c._data,
					X = c._83o,
					l = X.rect,
					U = X.position,
					e = X.rotation,
					Q = X.anchor,
					A = X.scale,
					V = X.shape,
					O = X.clipRect;
				if(!c._checkEmptyRect || l.width > 0 && l.height > 0) {
					var S = Y.getSize();
					if(S.x = -S.width * Q.x, S.y = -S.height * Q.y, T.save(), Zg(T, U.x, U.y), lo(T, e), $l(T, A.x, A.y), O && (T.beginPath(), T.rect(O.x, O.y, O.width, O.height), T.clip()), c.freeDraw) c.freeDraw(T, S, X);
					else if(V) {
						var C, L, z, $, B = X._60o,
							b = In(T, B),
							D = X._53o,
							W = X._27Q,
							y = X._54o,
							n = X._55o,
							M = X.shapeGradientPack,
							N = T.lineJoin,
							i = T.lineCap;
						if("roundRect" === V ? C = m("shape.corner.radius") : "polygon" === V ? C = m("shape.polygon.side") : "arc" === V && (C = m("shape.arc.from"), L = m("shape.arc.to"), z = m("shape.arc.close"), $ = m("shape.arc.oval")), T.lineJoin = X._62o, T.lineCap = X._61o, D || W || M) {
							var w = X.shapeClipRect;
							w && (T.save(), T.beginPath(), T.rect(w.x, w.y, w.width, w.height), T.clip()), Zn(T, V, S, C, L, z, $), M ? Rk(T, M) : W ? ko(T, W, X.bodyColor, null, Y, F) : $c(T, D, X.shapeGradient, X._59o, S), T.fill(), w && T.restore(), M && T.restore(), T !== b && Zn(b, V, S, C, L, z, $)
						} else Zn(b, V, S, C, L, z, $);
						if(y > 0) {
							var J = m("shape.border.width.absolute");
							J && (T.save(), T.setTransform(1, 0, 0, 1, 0, 0)), T.lineWidth = y, T.strokeStyle = n, T.stroke(), J && T.restore(), X._56o && Ud(T, n, X._57o, y, F._zoom, X._58o)
						}
						if(Rj(T, B), m("shape.dash")) {
							var r = m("shape.dash.width") || y;
							if(r > 0) {
								B = m("shape.dash.pattern");
								var b = In(T, B, c._2Q("shape.dash.offset"));
								b !== T && Zn(b, V, S, C, L, z, $), c._1Q(T, "shape", r, B)
							}
						}
						Nd(T, D, X._63o, S), T.lineJoin = N, T.lineCap = i
					} else yq(T, X.img, X.stretch, S.x, S.y, S.width, S.height, Y, F, X.bodyColor);
					T.restore()
				}
				c._39O(T, X)
			},
			_48O: function() {},
			_47O: function() {}
		});
		var yf = function(t, E) {
				wp(yf, this, [t, E])
			},
			Fk = function(B, x, f, c) {
				var h = uh(B, x);
				return f = c ? R(f, h) : ug(f, h), h ? f /= h : f = 0, {
					x: B.x + (x.x - B.x) * f,
					y: B.y + (x.y - B.y) * f
				}
			};
		xh(yf, sp, {
			_3O: function() {
				var q, y = this,
					e = y._data,
					b = y.gv,
					n = y.s,
					A = n(rb),
					k = e.isLooped(),
					l = n("edge.width"),
					j = n("edge.center"),
					$ = n("edge.offset"),
					O = b.getBorderColor(e),
					G = O ? n("border.width") : 0,
					i = y.getSelectWidth(),
					d = e._40I,
					s = e._41I,
					I = y._78o = d && s ? {
						looped: k,
						type: A,
						width: l,
						center: j,
						color: y.getBodyColor("edge.color"),
						borderColor: O,
						borderWidth: G,
						_97o: i ? n("select.color") : _,
						selectWidth: i,
						pattern: n("edge.pattern"),
						cap: n("edge.cap"),
						join: n("edge.join"),
						is3d: n("edge.3d"),
						_67o: n("edge.3d.color"),
						_66o: n("edge.3d.accuracy")
					} : _;
				if(I) {
					var H = h.getEdgeType(A);
					if(H) {
						var R = H(e, ac(y, b, e, k, A), b, y._19Q);
						R.points && R.points.size() > 1 ? (I._4O = R, q = kl(I._4O.points)) : R[Om] && R.rect && (I._4O = R, q = R.rect)
					} else {
						var x = n("edge.source.anchor.x"),
							E = n("edge.source.anchor.y"),
							g = n("edge.target.anchor.x"),
							C = n("edge.target.anchor.y"),
							z = Te(b, d, n("edge.source.position"), n("edge.source.offset.x"), n("edge.source.offset.y"), x, E),
							r = Te(b, s, n("edge.target.position"), n("edge.target.offset.x"), n("edge.target.offset.y"), g, C);
						if(A === re) {
							var W = I.points = n(tq) || Op,
								J = W.size();
							I.segments = n("edge.segments");
							var v = x !== S || E !== S,
								T = g !== S || C !== S;
							if(!j)
								if($) v || (z = Fk(z, J ? W.get(0) : r, $, J)), T || (r = Fk(r, J ? W.get(J - 1) : z, $, J));
								else {
									var Q;
									v || (Q = jh(z, J ? W.get(0) : r, Dq(b, d)), Q && (z = {
										x: Q[0],
										y: Q[1]
									})), T || (Q = jh(J ? W.get(J - 1) : z, r, Dq(b, s)), Q && (r = {
										x: Q[0],
										y: Q[1]
									}))
								}
							q = Xl(kl(I.points), kl(z, r))
						} else {
							var D = ac(y, b, e, k, A);
							if(y._19Q || (D = -D), k) z = sq(z), z.x = b.getNodeRect(d).x, I.radius = D, q = {
								x: z.x - D,
								y: z.y - D,
								width: 2 * D,
								height: 2 * D
							};
							else {
								var p = uh(z, r),
									F = ug($, p),
									u = {
										x: F,
										y: D
									},
									Z = {
										x: p - F,
										y: D
									},
									m = c(r.y - z.y, r.x - z.x),
									L = I.mat = new Fi(m);
								if(I.orienAngle = m, I.angle = r.x < z.x ? m + V : m, I.rect = {
										x: u.x,
										y: u.y,
										width: Z.x - u.x,
										height: 0
									}, I.origin = z, u = L.tf(u), u.x += z.x, u.y += z.y, Z = L.tf(Z), Z.x += z.x, Z.y += z.y, j) {
									var Y = {
										x: p,
										y: 0
									};
									Y = L.tf(Y), Y.x += z.x, Y.y += z.y, q = kl([z, u, Z, Y]), I.c1 = z, I.c2 = Y
								} else q = kl(u, Z);
								z = u, r = Z
							}
						}
						I.sourcePoint = z, I.targetPoint = r, e._lastSourcePoint = z, e._lastTargetPoint = r
					}
					var t = 0;
					n("edge.dash") && (t = n("edge.dash.width") || l);
					var K = "square" === I.cap ? .71 : .5;
					Do(q, N(t * K, l * K + G + i), I.join), y._68o(q)
				}
			},
			getRotation: function(E, S, I) {
				E = E || 0;
				var a = this._78o;
				if(a) {
					var L, A = a.angle,
						o = a.points,
						d = a._4O;
					if(A != _) return S ? a.orienAngle + E : A + E;
					if(d && d[Om]) return d.getRotation ? d.getRotation(this, E, S, I) : 0;
					if(d && d.points) {
						var G = d.points;
						return L = G.size(), Gb[I] ? L && 0 === L % 2 ? Ih(G.get(L / 2 - 1), G.get(L / 2), S, E) : E : Or[I] ? Ih(G.get(0), G.get(1), S, E) : Ih(G.get(L - 2), G.get(L - 1), S, E)
					}
					if(o) return L = o.size(), Gb[I] ? L && 0 === L % 2 ? Ih(o.get(L / 2 - 1), o.get(L / 2), S, E) : E : Or[I] ? Ih(a.sourcePoint, L ? o.get(0) : a.targetPoint, S, E) : Ih(L ? o.get(L - 1) : a.sourcePoint, a.targetPoint, S, E)
				}
				return E
			},
			getPosition: function(T, u, n, z, p) {
				var v = this._78o;
				if(v) {
					var j, Q = v.type,
						k = v.points,
						X = v._4O,
						g = v.sourcePoint,
						$ = v.targetPoint;
					if(!Q) return v.looped ? {
						x: g.x - v.radius + u,
						y: g.y + n
					} : (p && g && $ && (g.x > $.x || g.x === $.x && g.y > $.y) && (T = Se[T], n = -n), j = Uc(T, v.rect, z), j.x += u, j.y += n, j = v.mat.tf(j), j.x += v.origin.x, j.y += v.origin.y, j);
					if(X && X[Om]) return X.getPosition ? X.getPosition(this, T, u, n, z, p) : {
						x: (g.x + $.x) / 2,
						y: (g.y + $.y) / 2
					};
					if(k) {
						var j, Z = k.size();
						if(Gb[T]) {
							if(Z) {
								var t = Z % 2;
								if(0 === t) return Gq(k.get(Z / 2 - 1), k.get(Z / 2), T, u, n, z, p);
								j = k.get((Z - t) / 2)
							} else j = {
								x: (g.x + $.x) / 2,
								y: (g.y + $.y) / 2
							};
							return j = Uc(T, {
								x: j.x,
								y: j.y,
								width: 0,
								height: 0
							}, z), j.x += u, j.y += n, j
						}
						return Or[T] ? Gq(g, Z ? k.get(0) : $, T, u, n, z, p) : Gq(Z ? k.get(Z - 1) : g, $, T, u, n, z, p)
					}
					if(X) {
						var s = X.points,
							Z = s.size();
						if(Gb[T]) {
							var t = Z % 2;
							return 0 === t ? Gq(s.get(Z / 2 - 1), s.get(Z / 2), T, u, n, z, p) : (j = s.get((Z - t) / 2), j = Uc(T, {
								x: j.x,
								y: j.y,
								width: 0,
								height: 0
							}, z), j.x += u, j.y += n, j)
						}
						return Or[T] ? Gq(s.get(0), s.get(1), T, u, n, z, p) : Gq(s.get(Z - 2), s.get(Z - 1), T, u, n, z, p)
					}
				}
				return ih
			},
			_42: function(V) {
				this._78o && yf.superClass._42.call(this, V)
			},
			drawPath: function(V, B) {
				V.beginPath();
				var H = B.type,
					X = B.points,
					q = B.segments,
					s = B._4O;
				if(!H || X) {
					var Q = B.sourcePoint,
						U = Q.x,
						A = Q.y,
						G = B.targetPoint,
						M = G.x,
						T = G.y;
					if(H)
						if(q) {
							var u = new ag({
								x: U,
								y: A
							});
							u.addAll(X), u.add({
								x: M,
								y: T
							}), Vb(V, u, q)
						} else V.moveTo(U, A), X.each(function(S) {
							V.lineTo(S.x, S.y)
						}), V.lineTo(M, T);
					else B.looped ? V.arc(U, A, B.radius, 0, Z, !0) : B.center ? (V.moveTo(B.c1.x, B.c1.y), V.lineTo(U, A), V.lineTo(M, T), V.lineTo(B.c2.x, B.c2.y)) : (V.moveTo(U, A), V.lineTo(M, T))
				} else s && (s.points ? Vb(V, s.points, s.segments) : s[Om] && s[Om](V, s))
			},
			_80o: function(g) {
				var V = this,
					R = V.s,
					P = V._78o,
					n = P.width,
					I = P.selectWidth,
					u = P.borderWidth,
					E = P.color,
					X = g.lineJoin,
					C = g.lineCap,
					z = P.pattern;
				g.lineJoin = P.join, g.lineCap = P.cap, V.drawPath(In(g, z), P);
				var d = R("edge.width.absolute");
				if(d && (g.save(), g.setTransform(1, 0, 0, 1, 0, 0)), I && (g.strokeStyle = P._97o, g.lineWidth = n + 2 * (u + I), g.stroke()), u && (g.strokeStyle = P.borderColor, g.lineWidth = n + 2 * u, g.stroke()), g.strokeStyle = E, g.lineWidth = n, g.stroke(), P.is3d && Ud(g, E, P._67o, n, V.gv._zoom, P._66o), d && g.restore(), Rj(g, z), R("edge.dash")) {
					z = R("edge.dash.pattern");
					var b = In(g, z, V._2Q("edge.dash.offset"));
					b !== g && V.drawPath(b, P), V._1Q(g, "edge", R("edge.dash.width") || n, z)
				}
				g.lineJoin = X, g.lineCap = C
			},
			_48O: function() {},
			_47O: function() {},
			_71o: function(N, Q) {
				var n = this,
					T = n._data;
				if(n._19Q = !0, !T.getEdgeGroup()) return N ? T.s("edge.gap") : 0;
				var C, V = 0,
					d = 0,
					y = 0;
				if(T.getEdgeGroup().getSiblings().each(function(_) {
						_.each(function(N) {
							if(n.gv.isVisible(N) && N.s(rb) == Q) {
								var m = N.s("edge.gap");
								C ? (d += y / 2 + m / 2, y = m) : (C = N, y = m), N === T && (V = d)
							}
						})
					}), N) return d - V + y;
				var O = V - d / 2;
				return C && T._40I !== C._40I && (n._19Q = !1), O
			}
		});
		var Zo = function(s, N) {
			wp(Zo, this, [s, N])
		};
		xh(Zo, kc, {
			_3O: function() {
				var I, R, F = this,
					H = F.s,
					s = F._data,
					U = F.gv;
				if(F._88I = _, s.isExpanded() && s.eachChild(function(V) {
						var C = U.getBoundsForGroup(V);
						C && (R || (R = []), R.push(C), I = Xl(I, C))
					}), I) {
					var N = U.getLabel(s),
						M = H("group.type");
					I = me(M, R, I), ke(I, s, "group.padding", 1);
					var X = F._88I = {
						type: M,
						rect: I,
						_64o: I
					};
					if(!M && N != _) {
						var b, p = F.labelInfo = {
								label: N,
								color: H("group.title.color"),
								font: H("group.title.font"),
								align: H("group.title.align")
							},
							x = tg(p, N),
							k = x.width,
							l = x.height,
							z = H("group.title.align");
						k > I.width && (I.width = k), p.rect = {
							y: I.y - l,
							width: x.width,
							height: l
						}, b = z === vr ? I.x : z === Td ? I.x + I.width - k : I.x + I.width / 2 - k / 2, p.rect.x = b, X.titleRect = {
							x: I.x,
							y: I.y - l,
							width: I.width,
							height: l + 1
						}, X.rect = {
							x: I.x,
							y: I.y - l,
							width: I.width,
							height: I.height + l
						}
					}
					F._40O(X, H("group.border.width") / 2)
				} else Zo.superClass._3O.call(F)
			},
			getPosition: function(m, I, E, z) {
				var M = this._88I;
				if(M) {
					var t = Uc(m, M.rect, z);
					return t.x += I, t.y += E, t
				}
				return Zo.superClass.getPosition.apply(this, arguments)
			},
			_24O: function(b, D) {
				var W = this._88I;
				(!W || W.type || "label2" === b) && Zo.superClass._24O.call(this, b, D)
			},
			_80o: function(I) {
				var a = this,
					w = a._88I;
				if(w) {
					var s = a._data,
						d = a.s,
						L = a.gv,
						t = w.type,
						o = w.rect,
						N = w._64o,
						c = w.titleRect,
						K = a.getBodyColor(),
						C = Ui(d("group.image"), K),
						D = d("group.image.stretch"),
						E = a.getBodyColor("group.background"),
						h = Ui(d("group.repeat.image"), K),
						G = d("group.gradient.pack"),
						V = d("group.gradient"),
						$ = d("group.gradient.color"),
						J = d("group.depth");
					if(t) {
						var u = d("group.border.pattern"),
							Y = d("group.border.width"),
							j = I.lineJoin,
							g = I.lineCap;
						if(I.lineJoin = d("group.border.join"), I.lineCap = d("group.border.cap"), C) {
							if(I.save(), Zn(I, t, o), I.clip(), yq(I, C, D, o.x, o.y, o.width, o.height, s, L, K), I.restore(), Y > 0) {
								var X = In(I, u);
								Zn(X, t, o), I.lineWidth = Y, I.strokeStyle = d("group.border.color"), I.stroke(), Rj(I, u)
							}
						} else {
							var X = In(I, u);
							E || h || G ? (Zn(I, t, o), G ? Rk(I, G) : h ? ko(I, h, K, null, s, L) : $c(I, E, V, $, o), I.fill(), G && I.restore(), I !== X && Zn(X, t, o)) : Zn(X, t, o), Y > 0 && (I.lineWidth = Y, I.strokeStyle = d("group.border.color"), I.stroke()), Rj(I, u), t === Qe && Nd(I, E, J, o)
						}
						I.lineJoin = j, I.lineCap = g
					} else if(C ? yq(I, C, D, N.x, N.y, N.width, N.height, s, L, a.getBodyColor()) : (E || h) && (h ? ko(I, h, K, null, s, L) : $c(I, E, V, $, N), Zn(I, Qe, N), I.fill(), Nd(I, E, J, N)), c) {
						var r = d("group.title.background");
						jo(I, c.x, c.y, c.width, c.height, r), Nd(I, r, J, c)
					}
					a._39O(I, w)
				} else Zo.superClass._80o.call(a, I)
			}
		});
		var Sm = function(k, J) {
			wp(Sm, this, [k, J])
		};
		xh(Sm, kc, {
			_80o: function(I) {
				this._39O(I, this._83o)
			}
		});
		var Of = function(M, c) {
			wp(Of, this, [M, c])
		};
		xh(Of, kc, {
			_3O: function() {
				var n = this,
					E = n._data,
					q = n.s,
					Y = n.gv,
					J = E.getPoints(),
					y = Y.getBorderColor(E),
					g = y ? q("border.width") : 0,
					G = n.getSelectWidth(),
					X = q("shape.border.width"),
					j = E.getRect(),
					m = Y.getBodyColor(E),
					x = n._99o = J.isEmpty() ? _ : {
						rect: j,
						rotation: E.getRotation(),
						fillRule: q("shape.fill.rule"),
						scale: E.getScale(),
						position: E.p(),
						points: J,
						segments: E.getSegments(),
						bodyColor: m,
						borderColor: y,
						borderWidth: g,
						_94o: q("shape.border.3d"),
						_95o: q("shape.border.3d.color"),
						_96o: q("shape.border.3d.accuracy"),
						_97o: G ? q("select.color") : _,
						selectWidth: G,
						_53o: q("shape.background"),
						_27Q: Ui(q("shape.repeat.image"), m),
						shapeGradientPack: q("shape.gradient.pack"),
						_54o: X,
						_55o: q("shape.border.color"),
						shapeGradient: q("shape.gradient"),
						_59o: q("shape.gradient.color"),
						_60o: q("shape.border.pattern"),
						_61o: q("shape.border.cap"),
						_62o: q("shape.border.join")
					};
				if(x) {
					var z = E.getScale(),
						D = N(1, N(d(z.x), d(z.y)));
					q("shape.dash") && q("shape.dash.width") > X && (X = q("shape.dash.width"));
					var W = X * ("square" === x._61o ? .71 : .5) + g + G / n.gv._zoom / D;
					W && (W *= D, j = sq(j), Do(j, W, x._62o)), n._68o(j);
					var F = q("clip.percentage");
					1 > F && (0 > F && (F = 0), x.clipRect = ln(E.getAnchorRect(), q("clip.direction"), F));
					var s = q("shape.fill.clip.percentage");
					1 > s && (0 > s && (s = 0), x.shapeClipRect = ln(E.getAnchorRect(), q("shape.fill.clip.direction"), s))
				}
			},
			getPosition: function(J, R, Z, M) {
				var O = this._99o;
				if(O) {
					var c = Uc(J, O.rect, M);
					return c.x += R, c.y += Z, c
				}
				return ih
			},
			_42: function(I) {
				this._99o && Of.superClass._42.call(this, I)
			},
			_80o: function(F) {
				var A, H = this,
					k = H.s,
					n = H._99o,
					v = n.position,
					l = n.scale,
					R = n.rotation,
					s = n.bodyColor,
					g = n.borderWidth,
					y = n.selectWidth,
					d = n._53o,
					P = n._27Q,
					K = n.shapeGradientPack,
					$ = n._54o,
					O = n.clipRect,
					X = n.shapeClipRect,
					I = n.points,
					W = n.segments,
					N = H._data.isClosePath(),
					x = n.fillRule,
					i = d || P || K;
				F.save(), Zg(F, v.x, v.y), lo(F, R), $l(F, l.x, l.y), O && (F.beginPath(), F.rect(O.x, O.y, O.width, O.height), F.clip()), i && X && (F.save(), F.beginPath(), F.rect(X.x, X.y, X.width, X.height), F.clip()), Zg(F, -v.x, -v.y);
				var b = n._60o,
					B = In(F, b),
					u = F.lineJoin,
					c = F.lineCap;
				F.lineJoin = n._62o, F.lineCap = n._61o, i ? (Vb(F, I, W, N), K ? Rk(F, K) : P ? ko(F, P, s, null, H._data, H.gv) : (A = s ? s : d, $c(F, A, n.shapeGradient, n._59o, n.rect)), F.fill(x), X && (F.restore(), Zg(F, -v.x, -v.y)), K && F.restore(), B !== F && Vb(B, I, W, N)) : Vb(B, I, W, N);
				var Q = k("shape.border.width.absolute");
				if(Q && (F.save(), F.setTransform(1, 0, 0, 1, 0, 0)), y && (F.strokeStyle = n._97o, F.lineWidth = $ + 2 * (g + y), F.stroke()), g && (F.strokeStyle = n.borderColor, F.lineWidth = $ + 2 * g, F.stroke()), $ && (A = n._55o, !d && s && (A = s), F.strokeStyle = A, F.lineWidth = $, F.stroke(), n._94o && Ud(F, A, n._95o, $, H.gv._zoom, n._96o)), Q && F.restore(), Rj(F, b), k("shape.dash")) {
					var C = k("shape.dash.width") || $;
					if(C > 0) {
						b = k("shape.dash.pattern");
						var B = In(F, b, H._2Q("shape.dash.offset"));
						B !== F && Vb(B, I, W, N), H._1Q(F, "shape", C, b)
					}
				}
				F.lineJoin = u, F.lineCap = c, F.restore()
			},
			_48O: function() {},
			_47O: function() {}
		});
		var tc = function(X, o) {
			wp(tc, this, [X, o])
		};
		xh(tc, Of, {
			getRotation: function(t, o, m) {
				t = t || 0;
				var T = this._data.getPoints(),
					I = T.size();
				return I > 1 ? Gb[m] ? I && 0 === I % 2 ? Ih(T.get(I / 2 - 1), T.get(I / 2), o, t) : t : Or[m] ? Ih(T.get(0), T.get(1), o, t) : Ih(T.get(I - 2), T.get(I - 1), o, t) : t
			},
			getPosition: function(y, L, Y, H, T) {
				var d = this._data.getPoints(),
					r = d.size();
				if(r > 1) {
					if(Gb[y]) {
						var I = r % 2;
						if(0 === I) return Gq(d.get(r / 2 - 1), d.get(r / 2), y, L, Y, H, T);
						var f = d.get((r - I) / 2),
							p = {
								x: f.x,
								y: f.y,
								width: 0,
								height: 0
							};
						return f = Uc(y, p, H), f.x += L, f.y += Y, f
					}
					return Or[y] ? Gq(d.get(0), d.get(1), y, L, Y, H, T) : Gq(d.get(r - 2), d.get(r - 1), y, L, Y, H, T)
				}
				return ih
			}
		});
		var yd = function(s, w) {
			wp(yd, this, [s, w])
		};
		xh(yd, kc, {
			_3O: function() {
				var h = this;
				yd.superClass._3O.call(h);
				var H = h.s,
					c = h._83o;
				h._82o = c.img || c.shape ? _ : {
					background: h.getBodyColor("grid.background"),
					depth: H("grid.depth"),
					rect: c.rect,
					_88o: H("grid.cell.depth"),
					cellBorderColor: H("grid.cell.border.color"),
					_89o: H("grid.row.count"),
					_90o: H("grid.column.count"),
					block: H("grid.block"),
					_91o: H("grid.block.color"),
					_92o: H("grid.block.padding"),
					_93o: H("grid.block.width")
				}
			},
			_80o: function(d) {
				var z = this,
					H = z._82o;
				if(!H) return yd.superClass._80o.call(z, d), void 0;
				var p, G, q = z._data,
					t = H.background,
					w = H.rect,
					x = H.block,
					A = H._91o,
					E = H._92o,
					D = H._93o,
					g = H._88o,
					O = H.cellBorderColor,
					L = H._89o,
					M = H._90o;
				if(t)
					if(jo(d, w.x, w.y, w.width, w.height, t), Nd(d, t, H.depth, w), g)
						for(p = 0; L > p; p++)
							for(G = 0; M > G; G++) w = q.getCellRect(p, G), w && Nd(d, t, g, w);
					else if(O) {
					for(d.beginPath(), p = 0; L > p; p++)
						for(G = 0; M > G; G++) w = q.getCellRect(p, G), w && d.rect(w.x, w.y, w.width, w.height);
					d.strokeStyle = O, d.lineWidth = 1, d.stroke()
				}
				if("h" === x)
					for(p = 0; L > p; p++) w = Xl(q.getCellRect(p, 0), q.getCellRect(p, M - 1)), jk(w, E), so(d, A, w.x, w.y, w.width, w.height, D);
				else if("v" === x)
					for(G = 0; M > G; G++) w = Xl(q.getCellRect(0, G), q.getCellRect(L - 1, G)), jk(w, E), so(d, A, w.x, w.y, w.width, w.height, D);
				z._39O(d, z._83o)
			}
		});
		var ll = function(r, M) {
			wp(ll, this, [r, M])
		};
		xh(ll, kc, {
			_checkEmptyRect: !1,
			_81o: function() {
				var r = this._data,
					l = ll.superClass._81o.call(this),
					K = r.s("text");
				if(K != _) {
					var w, u, P = r.s("text.font"),
						C = r.s("text.align"),
						x = r.s("text.vAlign"),
						A = Re(P, K),
						M = A.width,
						n = A.height,
						B = r.getAnchor(),
						z = r.getWidth(),
						J = r.getHeight();
					"left" === C ? w = -z * B.x : "center" === C ? w = -z * B.x + (z - M) / 2 : "right" === C && (w = z * (1 - B.x) - A.width), "top" === x ? u = -J * B.y : "middle" === x ? u = -J * B.y + (J - n) / 2 : "bottom" === x && (u = J * (1 - B.y) - A.height);
					var h, o = r.getMatrix();
					if(h = kl([o.tf(w, u), o.tf(w + M, u), o.tf(w + M, u + n), o.tf(w, u + n)]), l = Xl(l, h), l && r.s("text.shadow")) {
						var D = sq(l);
						D.x += r.s("text.shadow.offset.x"), D.y += r.s("text.shadow.offset.y"), jk(D, r.s("text.shadow.blur")), l = Xl(l, D)
					}
				}
				return l
			}
		});
		var Kh = zf.Interactor = function(h) {
			this.gv = this._graphView = h
		};
		zl("Interactor", f, {
			ms_listener: 1,
			getView: function() {
				return this.gv.getView()
			},
			setUp: function() {
				this.addListeners()
			},
			tearDown: function() {
				this.removeListeners(), this.clear()
			},
			clear: function() {},
			fi: function(f) {
				this.gv.fi(f)
			},
			setCursor: function(o) {
				k || this.gv.setCursor(o)
			},
			startDragging: function(x) {
				var f = this;
				f._lastClientPoint = Br(x), f._lastLogicalPoint = f.gv.lp(x), ti(f, x)
			},
			clearDragging: function() {
				var B = this;
				B._lastClientPoint = B._lastLogicalPoint = B._logicalPoint = _
			},
			autoScroll: function(b) {
				return this.gv.autoScroll(b, this._lastClientPoint)
			}
		});
		var go = function(R) {
			var $ = this;
			$.gv = R, R.getView(), ["mousedown", "mousemove", "mouseup", "touchstart", "touchmove", "touchsend"].forEach(function(y) {
				$.addListener(y)
			})
		};
		xh(go, Kh, {
			interactiveDisabled: !1,
			addListener: function(F) {
				var b = this;
				b.gv.getView().addEventListener(F, function(L) {
					h.preventDefault(L), b.interactiveDisabled || b["handle_" + F](L)
				}, !1)
			},
			handle: function(e, j, k) {
				var C = this.gv;
				if(k = k || C.getDataInfoAt(j)) {
					var $ = k.part,
						c = k.data,
						q = k.ui;
					c[e] && c[e](j, c, C);
					var w;
					return "rect" === $ && q._83o && q._83o.img ? w = C.getImage(c) : "icons" === $ && (w = k.icon), this.handleImage(w, e, j, c, C), k
				}
			},
			handleImage: function(t, Y, F, p, o) {
				if(t && (t = Ui(t)) && (t[Y] && t[Y](F, p, o), t.comps))
					for(var B = 0; B < t.comps.length; B++) {
						var u = t.comps[B];
						u[Y] && u[Y](F, p, o)
					}
			},
			handle_mousedown: function(q) {
				this.handle("onDown", q)
			},
			handle_mousemove: function(A) {
				var H = this,
					o = H.gv;
				H._hoverTimer && (u(H._hoverTimer), delete H._hoverTimer);
				var $ = H.handle("onMove", A);
				$ && (H._hoverTimer = E(function() {
					u(H._hoverTimer), delete H._hoverTimer, H.handle("onHover", A, $)
				}, o.getHoverDelay() || h.hoverDelay))
			},
			handle_mouseup: function(k) {
				this.handle("onUp", k)
			},
			handle_touchstart: function(y) {
				this.handle("onDown", y)
			},
			handle_touchmove: function(S) {
				this.handle("onMove", S)
			},
			handle_touchend: function(D) {
				this.handle("onUp", D)
			},
			handleWindowMouseMove: function() {},
			handleWindowMouseUp: function() {}
		});
		var El = zf.DefaultInteractor = function(b) {
			wp(El, this, [b])
		};
		zl("DefaultInteractor", Kh, {
			handle_mousedown: function(R) {
				Aj(R);
				var X = this,
					M = X.gv,
					k = M.getDataAt(R);
				!M.setFocus(R) || M._editing || M._scrolling || (Jm(R) ? M.handleDoubleClick(R, k) : M.handleClick(R, k), !ec() && k || !M.isPannable() || !Ln(R) || Sj(R) || (X._tx = M.tx(), X._ty = M.ty(), X.startDragging(R)))
			},
			handleWindowMouseUp: function(x) {
				var X = this,
					g = X.gv;
				g._panning && (delete g._panning, g.onPanEnded(), X.fi({
					kind: "endPan",
					event: x
				})), delete X._tx, delete X._ty, X.clearDragging()
			},
			handle_mousemove: function(v) {
				var S = this,
					e = S.gv;
				S._hoverTimer && (u(S._hoverTimer), delete S._hoverTimer), S._hoverTimer = E(function() {
					S.fi({
						kind: "hover",
						event: v
					}), u(S._hoverTimer), delete S._hoverTimer
				}, e.getHoverDelay() || h.hoverDelay)
			},
			handle_touchmove: function(S) {
				this.handle_mousemove(S)
			},
			handleWindowMouseMove: function(h) {
				var P = this,
					J = P.gv,
					x = P._lastClientPoint;
				P.fi({
					kind: J._panning ? "betweenPan" : "beginPan",
					event: h
				}), J._panning = 1, J.setTranslate(P._tx + h.clientX - x.x, P._ty + h.clientY - x.y)
			},
			handle_mousewheel: function(q) {
				this.gv.handleScroll(q, q.wheelDelta)
			},
			handle_DOMMouseScroll: function(K) {
				2 === K.axis && this.gv.handleScroll(K, -K.detail)
			},
			handle_keydown: function(A) {
				this.gv.handleKeyDown(A)
			}
		});
		var sn = zf.SelectInteractor = function(B) {
			wp(sn, this, [B])
		};
		zl("SelectInteractor", Kh, {
			_42: function() {
				var W = this,
					S = W.gv,
					K = S.getZoom(),
					e = W.mark,
					R = W.div;
				R || (R = W.div = ff(), Yb(W.getView(), R));
				var m = {};
				m.x = e.x * K + S.tx(), m.y = e.y * K + S.ty(), m.width = e.width * K, m.height = e.height * K, Pm(R, m), this.intersects() ? (R.style.border = "", R.style.background = S.getRectSelectBackground()) : (R.style.background = "", R.style.border = "1px solid " + S.getRectSelectBorderColor())
			},
			handle_mousedown: function(j) {
				var z = this,
					C = z.gv;
				if(z._57I = _, !(C._editing || C._scrolling || ec())) {
					var J = C.getDataAt(j),
						X = C.sm();
					if(J)
						if(Sj(j)) X.co(J) ? X.rs(J) : X.as(J);
						else if(X.co(J)) {
						if(Jm(j) && J instanceof es && J.isClickThroughEnabled()) {
							var $ = C.getDataAt(j, function(R) {
								C._clickThroughChecking = !0;
								var Z = R.getParent() === J && C.isSelectable(R);
								return delete C._clickThroughChecking, Z
							});
							$ && (j.clickThrough = !0, X.ss($))
						}
					} else X.ss(J);
					else Sj(j) || !C.isPannable() ? Ln(j) && (Sj(j) || X.cs(), C.isRectSelectable() && (z.startDragging(j), C._77O = 1)) : Ln(j) && (z._57I = Br(j))
				}
			},
			handle_mouseup: function(C) {
				var s = this,
					y = s._57I;
				y && (uh(y, Br(C)) <= 1 && s.gv.sm().cs(), s._57I = _)
			},
			handleWindowMouseUp: function(f) {
				this.clear(f)
			},
			handleWindowMouseMove: function(R) {
				var m = this,
					I = m.gv;
				m._logicalPoint = I.lp(R), m.mark ? (m.fi({
					kind: "betweenRectSelect",
					event: R
				}), I.isPannable() && m.autoScroll(R), m.redraw()) : m.fi({
					kind: "beginRectSelect",
					event: R
				}), m.mark = kl(m._lastLogicalPoint, m._logicalPoint), m.redraw()
			},
			intersects: function() {
				var R = this,
					D = R._lastLogicalPoint,
					c = R._logicalPoint;
				return D.x > c.x || D.y > c.y
			},
			clear: function(v) {
				var k = this,
					n = k.gv,
					H = k.mark;
				if(k._57I = _, k._lastLogicalPoint) {
					if(H) {
						if(0 !== H.width && 0 !== H.height) {
							var F = n.getDatasInRect(H, k.intersects());
							if(!F.isEmpty()) {
								var S = n.sm(),
									E = S.toSelection();
								F.each(function(D) {
									S.co(D) ? E.remove(D) : E.add(D)
								}), S.ss(E)
							}
						}
						Cj(k.div), delete k.div, delete k.mark, k.redraw(), k.fi({
							kind: "endRectSelect",
							event: v
						}), n.onRectSelectEnded()
					}
					k.clearDragging(), delete n._77O
				}
			},
			redraw: function() {
				var w = this;
				w._draw || (w._draw = 1, E(function() {
					w.mark && w._42(), delete w._draw
				}, 16))
			}
		});
		var Qj = zf.MoveInteractor = function(d) {
			wp(Qj, this, [d])
		};
		zl("MoveInteractor", Kh, {
			handle_mousedown: function(U) {
				var c = this,
					X = c.gv;
				if(Ln(U) && !X._editing && !X._scrolling && !ec()) {
					var M = X.getSelectedDataAt(U);
					M ? (c._data = M, X.handleMouseDown && X.handleMouseDown(U, M), c.startDragging(U), X.isMovable(M) && (X._moving = 1)) : X._focusData = _
				}
			},
			handleWindowMouseUp: function(I) {
				var O = this,
					X = O.gv;
				X.handleMouseUp && X.handleMouseUp(I, O._data), O.clear(I)
			},
			handleWindowMouseMove: function(z) {
				var Y = this,
					n = Y._data,
					b = Y.gv;
				if((!b._93O || !b._93O(z, n)) && b._moving) {
					Y._logicalPoint || Y.fi({
						kind: "prepareMove",
						event: z
					});
					var e = Y._logicalPoint ? "betweenMove" : "beginMove",
						B = {
							kind: e,
							event: z
						},
						D = Y._logicalPoint = b.lp(z);
					"beginMove" !== e || Y._alreadyBeginTransaction || (Y._alreadyBeginTransaction = !0, b.getDataModel().beginTransaction());
					var H = Y._calcShift(e, z),
						i = H.x,
						F = H.y,
						I = Y.gv.getMoveMode(z, n);
					I && ("x" === I ? F = 0 : "y" === I ? i = 0 : "xy" !== I && (i = F = 0)), b.moveSelection(i, F), Y._lastLogicalPoint = D, Y.autoScroll(z), Y.fi(B)
				}
			},
			_calcShift: function() {
				var x = this,
					X = x._logicalPoint,
					m = x._lastLogicalPoint,
					r = X.x - m.x,
					g = X.y - m.y;
				return {
					x: r,
					y: g
				}
			},
			clear: function(K) {
				var x = this,
					C = x.gv;
				x._lastLogicalPoint && (x._lastLogicalPoint = x._data = C._moving = _, x._logicalPoint && (x.fi({
					kind: "endMove",
					event: K
				}), C.onMoveEnded()), x.clearDragging()), x._alreadyBeginTransaction && (x._alreadyBeginTransaction = !1, C.getDataModel().endTransaction())
			}
		});
		var Ak = zf.ScrollBarInteractor = function(j) {
			wp(Ak, this, [j])
		};
		zl("ScrollBarInteractor", Kh, {
			_41o: function() {
				return this.gv.getViewRect().height < this.gv.getScrollRect().height
			},
			_40o: function() {
				return this.gv.getViewRect().width < this.gv.getScrollRect().width
			},
			isV: function(S) {
				var l = this.gv.getViewRect();
				return this._41o() && (l.x + l.width - this.gv.lp(S).x) * this.gv.getZoom() < jq
			},
			isH: function(N) {
				var i = this.gv.getViewRect();
				return this._40o() && (i.y + i.height - this.gv.lp(N).y) * this.gv.getZoom() < jq
			},
			handle_mousemove: function(k) {
				this.handle_touchmove(k)
			},
			handle_touchmove: function(n) {
				if(!zg && Ln(n) && this.gv.isScrollBarVisible()) {
					var H = this,
						S = H.isV(n),
						Y = H.isH(n);
					(S || Y) && H.gv.showScrollBar(), H.gv._scrolling = S || Y
				}
			},
			handleWindowMouseUp: function(g) {
				this.handleWindowTouchEnd(g)
			},
			handleWindowTouchEnd: function(S) {
				this._state = this._cp = this._tx = this._ty = this.gv._scrolling = _, this.fi({
					kind: "endScroll",
					event: S
				})
			},
			handle_mousedown: function(m) {
				this.handle_touchstart(m)
			},
			handle_touchstart: function(z) {
				var f = this;
				if(f.gv.setFocus(z), Aj(z), f.handle_touchmove(z), !(_g(z) > 1) && f.gv._scrolling && f.gv.isScrollBarVisible()) {
					f._cp = Br(z), f._tx = f.gv.tx(), f._ty = f.gv.ty();
					var E = f.isV(z);
					f._state = E ? "vScroll" : "hScroll", ti(f, z), f.fi({
						kind: "beginScroll",
						event: z
					})
				}
			},
			handleWindowMouseMove: function(d) {
				this.handleWindowTouchMove(d)
			},
			handleWindowTouchMove: function(e) {
				var k = Br(e),
					I = this.gv.getViewRect(),
					i = this.gv.getScrollRect();
				"vScroll" === this._state ? this.gv.ty(this._ty + (this._cp.y - k.y) * i.height / I.height) : "hScroll" === this._state && this.gv.tx(this._tx + (this._cp.x - k.x) * i.width / I.width), this.fi({
					kind: "betweenScroll",
					event: e
				})
			}
		});
		var Al = zf.TouchInteractor = function(A, j) {
			j = j || {}, j.selectable === S && (j.selectable = !0), j.movable === S && (j.movable = !0), j.pannable === S && (j.pannable = !0), j.pinchable === S && (j.pinchable = !0), j.editable === S && (j.editable = !0), this.params = j, wp(Al, this, [A])
		};
		zl("TouchInteractor", Kh, {
			ms_edit: 1,
			setUp: function() {
				var p = this;
				Al.superClass.setUp.call(p), k && p.params.editable && p.gv.setEditInteractor(p)
			},
			tearDown: function() {
				var C = this;
				Al.superClass.tearDown.call(C), k && C.params.editable && C.gv.setEditInteractor(_)
			},
			clear: function(j) {
				var X = this,
					q = X.gv;
				q._moving && (X.fi({
					kind: "endMove",
					event: j
				}), delete q._moving, q.onMoveEnded(), q.dm().endTransaction()), q._panning && (X.fi({
					kind: "endPan",
					event: j
				}), delete q._panning, q.onPanEnded()), q._pinching && (X.fi({
					kind: "endPinch",
					event: j
				}), delete q._pinching, q.onPinchEnded()), q._editing && (X._46O(j), X._77I = X._node = X._edge = X._shape = X._rect = X._89I = X._index = q._editing = _), X._moving = X._panning = X._pinching = X._editing = X._57I = X._data = X._beginHistory = _, X.clearDragging()
			},
			handle_touchstart: function(X) {
				var y = this;
				if(!y.gv._editing) {
					Aj(X), y._57I = _;
					var L = y.params,
						U = y.gv,
						t = U.sm(),
						f = U.getDataAt(X),
						V = _g(X);
					if(1 === V) {
						if(Jm(X)) return U.handleDoubleClick(X, f), void 0;
						U.handleClick(X, f), f && (U.handleMouseDown && U.handleMouseDown(X, f), y._data = f), L.selectable || (f = _), f ? (t.co(f) || t.ss(f), L.editable && U.isEditable(f) && y._79I(X, f, !0) ? (y._editing = 1, y.startDragging(X)) : L.movable && U.isMovable(f) && (y._moving = 1, y.startDragging(X))) : (y._57I = Br(X), L.pannable && U.isPannable() && (y._panning = 1, y.startDragging(X), y._translate = {
							x: U.tx(),
							y: U.ty()
						}))
					} else if(L.pinchable && 2 === V) {
						y._pinching = 1, y.startDragging(X);
						var s = U.getView(),
							l = U.getZoom(),
							m = s.getBoundingClientRect(),
							z = X.touches[0],
							J = X.touches[1],
							p = {
								x: (z.clientX + J.clientX) / 2 - m.left,
								y: (z.clientY + J.clientY) / 2 - m.top
							};
						p.x -= U.tx(), p.y -= U.ty(), p.x /= l, p.y /= l, y._p = p, y._d = Ie(X)
					}
				}
			},
			handle_touchend: function(c) {
				var n = this,
					R = n.gv,
					d = n._57I,
					o = n._data;
				d && (uh(d, Br(c)) <= 1 && R.sm().cs(), n._57I = _), o && R.handleMouseUp && R.handleMouseUp(c, o)
			},
			handleWindowTouchEnd: function(r) {
				this.clear(r)
			},
			handleWindowTouchMove: function(x) {
				var K = this,
					Q = K.gv,
					r = _g(x);
				if(1 === r) {
					if(K._editing && (K._beginHistory || (K._beginHistory = 1, Q.dm().beginTransaction()), Q._editing = 1, K._78I(x)), K._moving) K._beginHistory || (K._beginHistory = 1, Q.dm().beginTransaction()), K.handleMove(x);
					else if(K._panning) {
						var _ = Br(x);
						Q.setTranslate(K._translate.x + _.x - K._lastClientPoint.x, K._translate.y + _.y - K._lastClientPoint.y), K.fi({
							kind: Q._panning ? "betweenPan" : "beginPan",
							event: x
						}), Q._panning = 1
					}
				} else if(2 === r && K._pinching) {
					var p = Ie(x);
					Q.handlePinch(K._p, p, K._d), K._d = p, K.fi({
						kind: Q._pinching ? "betweenPinch" : "beginPinch",
						event: x
					}), Q._pinching = 1
				}
			},
			handleMove: function(M) {
				var N = this,
					d = N.gv,
					q = d.lp(M);
				d._93O && d._93O(M, N._data) || (d.moveSelection(q.x - N._lastLogicalPoint.x, q.y - N._lastLogicalPoint.y), N._lastLogicalPoint = q, N.autoScroll(M), N.fi({
					kind: d._moving ? "betweenMove" : "beginMove",
					event: M
				}), d._moving = 1)
			}
		});
		var z = Y.ht,
			ss = z.graph._editor = {
				Math: {},
				Guide: {}
			};
		z.Math = ss.Math, ss.getStyle = function(v) {
			var $, F = ss.StyleMap;
			return F && ($ = F[v], $ !== S) ? $ : ss.DefaultStyleMap[v]
		}, ss.setStyle = function(N, Y) {
			var X = ss.StyleMap;
			X || (X = ss.StyleMap = {}), X[N] = Y
		}, ss.inEdit = function(E) {
			return E._inXEdit === !0
		}, ss.startEdit = function(N) {
			N._inXEdit = !0, ss.Inject.doInject(N)
		}, ss._46O = function(k) {
			k._inXEdit = !1, ss.Inject.undoInject(k)
		}, ss.toScreenPosition = function(F, L) {
			var e = F.tx(),
				W = F.ty(),
				q = F._zoom;
			return new ss.Math.Vector2(L.x * q + e, L.y * q + W)
		}, ss.checkHit = function(w, A, t) {
			return w.distanceTo(A) < t ? !0 : !1
		}, ss.toWorldPosition = function(U, V) {
			var k = U.tx(),
				w = U.ty(),
				Y = U._zoom;
			return {
				x: (V.x - k) / Y,
				y: (V.y - w) / Y
			}
		}, ss.setAntialias = function(c, k) {
			for(var $, T = ["imageSmoothingEnabled", "webkitImageSmoothingEnabled", "mozImageSmoothingEnabled", "oImageSmoothingEnabled", "msImageSmoothingEnabled"], D = 0, h = T.length; h > D && ($ = T[D], !($ in c)); D++);
			c[$], c[$] = k
		}, ss.getTargetCornersOnScreen = function(h, A) {
			if(!A) return null;
			var z, o = [];
			if(Ef(A, h)) {
				var X = Dq(h, A);
				z = [{
					x: X.x,
					y: X.y
				}, {
					x: X.x + X.width,
					y: X.y
				}, {
					x: X.x + X.width,
					y: X.y + X.height
				}, {
					x: X.x,
					y: X.y + X.height
				}]
			} else {
				if(!A.getCorners) return null;
				z = A.getCorners()
			}
			return z.forEach(function(a) {
				var Q = ss.toScreenPosition(h, a);
				o.push(Q.x, Q.y)
			}), o
		}, ss.log = function() {};
		var Ic = ss.Inject = {
			_modules: []
		};
		Ic.registAsModule = function(n, Q) {
			var C = {},
				y = {};
			for(var F in n) {
				var u = Q.prototype[F];
				C[F] = u
			}
			n.getBackup = function(r) {
				return C[r]
			}, n.getBackups = function() {
				return C
			}, y.doInject = function() {
				for(var u in n) "getBackup" !== u && (Q.prototype[u] = n[u])
			}, y.undoInject = function() {
				for(var Z in n) "getBackup" !== Z && (Q.prototype[Z] = C[Z])
			}, Ic._modules.push(y)
		}, Ic.doInject = function(F) {
			for(var Y, S = Ic._modules, I = 0, s = S.length; s > I; I++) Y = S[I], Y.doInject(F)
		}, Ic.undoInject = function(J) {
			for(var q, i = Ic._modules, A = 0, _ = i.length; _ > A; A++) q = i[A], q.undoInject(J)
		};
		var Kh = z.graph.EditInteractor = function(p) {
				var S = this,
					u = r.createElement("canvas");
				u.className = "editCanvas", u.style.position = "absolute", S._styleMap = {}, S._canvas = u, S._context = u.getContext("2d"), Kh.superClass.constructor.call(S, p), ss.setAntialias(S._context, !1), S._subModules = [new ss.Anchor(S), new ss.Rect(S), new ss.Curve(S), new ss.MoveHelper(S)], S._gridGuide = new ss.Guide.Grid(S), S._rectGuide = new ss.Guide.Rect(S)
			},
			lj = Kh;
		z.Default.def(Kh, z.graph.Interactor, {
			ms_edit: 1,
			ms_fire: 1
		}), f.defineProperties(Kh.prototype, {
			editDetail: {
				get: function() {
					var Q = !!this._editDetail;
					return Q
				},
				set: function(A) {
					var q = this,
						L = q._editDetail;
					L !== A && (q._editDetail = A, q.gv._editing = A, q.fp("editDetail", L, A), q.fp("pointsEditingMode", L, A), q.fi({
						kind: A ? "beginEditPoints" : "endEditPoints"
					}))
				}
			},
			gvEditing: {
				get: function() {
					return this.gv._editing
				},
				set: function(V) {
					(!this._editDetail || V) && (this.gv._editing = V, V || (this.editDetail = !1))
				}
			},
			editing: {
				get: function() {
					return this._editing
				},
				set: function(a) {
					this._editing = a, this.gvEditing = a
				}
			},
			pointsEditingMode: {
				get: function() {
					return this.editDetail
				},
				set: function(Z) {
					var w = this;
					w.editDetail !== Z && (Z ? w._tryEnterEditDetailMode() : w._tryQuitEditDetailMode())
				}
			},
			gridEnabled: {
				get: function() {
					var H = this._gridEnabled;
					if(!H) return !1;
					var y = this.gv;
					return y ? !0 : !0
				},
				set: function(P) {
					P !== this._gridEnabled && (this._gridEnabled = P, this._42())
				}
			},
			alignmentGuideEnabled: {
				get: function() {
					return this._agEnabled
				},
				set: function(k) {
					k !== this._agEnabled && (this._agEnabled = k, this._42())
				}
			},
			gridGuide: {
				get: function() {
					return this._gridGuide
				}
			},
			rectGuide: {
				get: function() {
					return this._rectGuide
				}
			}
		}), Kh.prototype.getSubModule = function(L) {
			var p, s, _, e = this._subModules;
			for(s = 0, _ = e.length; _ > s; s++)
				if(p = e[s], p.catalog === L) return p
		}, Kh.prototype.invokeSubModule = function(l, E) {
			var N = this,
				t = N._subModules;
			if(t)
				for(var n, O, z, j = Array.prototype.slice.call(arguments, 2), K = 0, A = t.length; A > K; K++)
					if(n = t[K], O = n[l], O && (z = O.apply(n, j), z != S && E)) return n
		}, Kh.prototype.invokeSubModuleInverse = function(c, M) {
			var D = this,
				T = D._subModules;
			if(T)
				for(var i, E, L, B = Array.prototype.slice.call(arguments, 2), u = T.length - 1; u >= 0; u--)
					if(i = T[u], E = i[c], E && (L = E.apply(i, B), L != S && M)) return i
		}, Kh.prototype.setUp = function() {
			ss.log("setUp");
			var V = this,
				a = V.gv,
				F = a.getView(),
				J = V._canvas;
			Kh.superClass.setUp.call(V), a.setEditInteractor(V), a._79O ? F.insertBefore(J, a._79O) : F.appendChild(J), ss.startEdit(a), V.invokeSubModule("setUp"), a.dm().mm(V._onDataModelChanged, V), a.dm().md(V._onDataPropertyChanged, V)
		}, Kh.prototype.tearDown = function() {
			ss.log("tearDown");
			var y = this,
				P = y.gv,
				z = P.getView();
			y._resetCustomCursorStyle(), Kh.superClass.tearDown.call(y), P.dm().umm(y._onDataModelChanged, y), P.dm().umd(y._onDataPropertyChanged, y), P.setEditInteractor(null), z.removeChild(y._canvas), y._drawTimer && (u(y._drawTimer), y._drawTimer = null), ss._46O(P), y.invokeSubModule("tearDown")
		}, Kh.prototype._onDataModelChanged = function(g) {
			var E = this;
			("clear" === g.kind || "remove" === g.kind && E.editDetail && g.data === E.getSubModule("Curve").target) && (E.editDetail = !1, E._42())
		}, Kh.prototype._onDataPropertyChanged = function(b) {
			var w = this;
			if(w.editDetail) {
				var T = w.getSubModule("Curve"),
					I = b.data;
				I === T.target && (I._writing || T._handleDataChanged())
			}
		}, Kh.prototype.clear = function() {
			ss.log("clear")
		}, Kh.prototype.redraw = function() {
			this._42()
		}, Kh.prototype._42 = function() {
			var r = this;
			r._drawTimer || (r._drawTimer = E(function() {
				r._drawTimer = null, r.drawImpl()
			}, 0))
		}, Kh.prototype.drawImpl = function() {
			var f;
			for(f in {
					_42: !0
				}) break;
			return function() {
				var W = this,
					X = W._canvas,
					h = W.gv,
					l = h.getWidth(),
					k = h.getHeight(),
					d = W._context,
					n = z.Default.getInternal();
				(X.width !== l || X.height !== k) && n.setCanvas(X, l, k), d.clearRect(0, 0, X.width, X.height);
				var I = W._getValidSelection();
				d.save();
				var J = z.Default.devicePixelRatio;
				d.scale(J, J), W._gridGuide._42(), W._rectGuide._42(), W.invokeSubModuleInverse(f, !1, d, h, I), d.restore()
			}
		}(), Kh.prototype._getValidSelection = function() {
			var R = this,
				V = R.gv,
				B = V.sm().getSelection(),
				Q = [];
			return B.each(function(L) {
				V.isVisible(L) && V.isEditable(L) && Q.push(L)
			}), Q
		}, Kh.prototype.handle_touchmove = function(H) {
			return this.handle_mousemove(H)
		}, Kh.prototype.handle_mousemove = function(q) {
			if(!z.Default.isDragging()) {
				var G = this;
				(G.editDetail || !ec()) && (G.gvEditing = !1, G._checkEdit(q) && (G.gvEditing = !0))
			}
		}, Kh.prototype.handle_touchstart = function(S) {
			return this.handle_mousedown(S)
		}, Kh.prototype.handle_mousedown = function(s) {
			Aj(s);
			var O = this;
			if(O.editDetail || !ec()) {
				if(Jm(s) && !s.clickThrough) {
					if(O.editDetail) {
						if(O._tryQuitEditDetailMode(s)) return
					} else if(O._tryEnterEditDetailMode()) return;
					O.gv.dm().beginTransaction();
					var z = O.invokeSubModule("handleDoubleClick", !0, s);
					if(O.gv.dm().endTransaction(), z) return
				}
				var y = O._checkEdit(s);
				y && (O._downPosition = O._getLogicalPoint(s), O.gv.dm().beginTransaction(), y.startEdit(O, s), O.editing = !0)
			}
		}, Kh.prototype._checkEdit = function(F) {
			var E = this,
				Z = E.gv,
				N = E._getLogicalPoint(F),
				Y = E.invokeSubModule("check", !0, Z, F, N) || null;
			return E._editMod = Y, Y
		}, Kh.prototype.handleWindowTouchMove = function(F) {
			return this.handleWindowMouseMove(F)
		}, Kh.prototype.handleWindowMouseMove = function(u) {
			var L = this,
				c = L._downPosition;
			if(c) {
				var Z = L._getLogicalPoint(u);
				if(Z.distanceTo(c) < L.getStyle("moveSensitivity")) return;
				delete L._downPosition
			}
			var S = L._editMod;
			S && S.handleEdit(L.gv, u)
		}, Kh.prototype._getLogicalPoint = function(y) {
			var Y = this,
				R = z.Default.getLogicalPoint(y, Y._canvas);
			return new ss.Math.Vector2(R)
		}, Kh.prototype.handleWindowTouchEnd = function(k) {
			return this.handleWindowMouseUp(k)
		}, Kh.prototype.handleWindowMouseUp = function() {
			var r;
			for(r in {
					_46O: !0
				}) break;
			return function(y) {
				var T = this;
				T.editing = !1, T.setCursor("default"), T.invokeSubModule(r, !1, y), T._42(), T.gv.dm().endTransaction()
			}
		}(), Kh.prototype.handle_mousewheel = function(x) {
			var O = this;
			Aj(x), O.invokeSubModule("preHandleScroll", !0) || O.gv.handleScroll(x, x.wheelDelta)
		}, Kh.prototype.handleDelete = function() {
			var t = this;
			if(!t.editDetail) {
				t.gv.dm().beginTransaction();
				var L = t.invokeSubModule("handleNormalStateDelete", !0);
				return t.gv.dm().endTransaction(), L || t.gv.removeSelection(), void 0
			}
			t.gv.dm().beginTransaction(), t.invokeSubModule("handleDelete", !0), t.gv.dm().endTransaction(), t._42()
		}, Kh.prototype.handle_keydown = function(z) {
			var k = this;
			if((z.metaKey || z.ctrlKey) && k._42(), ec(z) && !k.editing) return k.gvEditing = !1, k.setCursor("default"), k._42(), void 0;
			var J = iq(z);
			return k.editDetail ? ((J || _f(z)) && (k.editDetail = !1, k._42()), k.gv.dm().beginTransaction(), k.invokeSubModule("handle_keydown", !0, z), k.gv.dm().endTransaction(), void 0) : (k.gv.dm().beginTransaction(), k.invokeSubModule("handleNormalStateKeyDown", !0, z), k.gv.dm().endTransaction(), J && k._tryEnterEditDetailMode(), void 0)
		}, Kh.prototype.handle_keyup = function($) {
			this.gv.dm().beginTransaction(), this.invokeSubModule("handle_keyup", !0, $), this.gv.dm().endTransaction()
		}, Kh.prototype._tryEnterEditDetailMode = function() {
			var D = this;
			return !D.editDetail && D.invokeSubModule("canEnterEditDetailMode", !0) && 1 === D._getValidSelection().length ? (D.editDetail = !0, D._42(), !0) : void 0
		}, Kh.prototype._tryQuitEditDetailMode = function(q) {
			var N = this;
			if(N.editDetail) {
				var r = N.gv,
					s = N.getSubModule("Curve").target;
				return q && r.getDataAt(q) === s ? void 0 : (N.editDetail = !1, N._42(), !0)
			}
		}, Kh.prototype.setStyle = function(e, g, S) {
			var D = this;
			S ? ss.setStyle(e, g) : D._styleMap[e] = g, D.fp("styleChanged", null, {
				key: e,
				value: g,
				base: S
			}), D._42()
		}, Kh.prototype.getStyle = function(p) {
			var b = this,
				H = b._styleMap[p];
			return H !== S ? H : ss.getStyle(p)
		}, Kh.prototype.setCursor = function(V) {
			this._resetCustomCursorStyle(), z.graph.EditInteractor.superClass.setCursor.call(this, V)
		}, Kh.prototype._resetCustomCursorStyle = function() {
			var o = this;
			if(o._customStyle) {
				var T = this.gv.getView();
				T.classList && T.classList.remove && T.classList.remove(o._customStyle), o._customStyle = null
			}
		}, Kh.prototype._setRotateCursor = function(y) {
			var Y = this,
				L = Y._cursorFactory;
			L || (L = Y._cursorFactory = new ss.CursorFactory(Y));
			var s = L.getRotateCursor(y),
				o = Y.gv.getView();
			Y._resetCustomCursorStyle(), Y._customStyle = s, o.classList && o.classList.add && o.classList.add(s)
		};
		var Rf = ss.Group = function(J) {
			var f = this;
			f._entities = J, f._64O = 0, f._position = {
				x: 0,
				y: 0
			}, f._scale = {
				x: 1,
				y: 1
			}, f._anchor = {
				x: .5,
				y: .5
			}, f._anchor2 = {
				x: .5,
				y: .5
			}
		};
		Rf.prototype = {}, Rf.prototype.constructor = Rf;
		var Th = null;
		Rf.findOrCreateGroup = function(O) {
			if(Th && Th.checkIsMe(O)) return Th;
			var F = new ss.Group(O);
			return F.getKeyOb() ? (Th = F, F) : void 0
		}, Rf.prototype.checkIsMe = function(t) {
			var V = this._entities;
			if(V.length !== t.length) return !1;
			var K, l = {},
				h = t.length;
			for(K = 0; h > K; K++) l[t[K]._id] = !0;
			for(K = 0; h > K; K++)
				if(!l[V[K]._id]) return !1;
			return !0
		}, Rf.prototype.getRotation = function() {
			return this._64O
		}, Rf.prototype.getPosition = function() {
			return this._position
		}, Rf.prototype.getAnchor = function() {
			return this._anchor
		}, Rf.prototype.getWidth = function() {
			return this._width
		}, Rf.prototype.getScale = function() {
			return this._scale
		}, Rf.prototype.getSize = function() {
			return {
				width: this._width,
				height: this._height
			}
		}, Rf.prototype.getHeight = function() {
			return this._height
		}, Rf.prototype.getKeyOb = function() {
			for(var U = this._entities, m = U.length - 1; m >= 0; m--) {
				var g = U[m];
				if(this.isNode(g)) return g
			}
		}, Rf.prototype.getAnchor2 = function() {
			var I = this,
				s = I.rotateCenter;
			if(s) return s;
			var w = I.getKeyOb();
			if(!w) return I._anchor;
			var B = I._anchor2,
				a = w.getMatrix();
			return a.tf({
				x: w.getWidth() * (B.x - w.getAnchor().x),
				y: w.getHeight() * (B.y - w.getAnchor().y)
			})
		}, Rf.prototype.setAnchor2 = function(y, O) {
			var o = this,
				R = o.getKeyOb();
			if(R) {
				var H, g = R.getMatrix();
				H = "number" == typeof y ? {
					x: y,
					y: O
				} : y;
				var J = g.tfi(H);
				o._anchor2 = {
					x: R.getAnchor().x + J.x / R.getWidth(),
					y: R.getAnchor().y + J.y / R.getHeight()
				}
			}
		}, Rf.prototype.setRotation = function() {}, Rf.prototype.beginRotate = function($) {
			this.rotateCenter = $.pos, this.rotateMode = $.groupRotateMode
		}, Rf.prototype.endRotate = function() {
			delete this.rotateCenter, delete this.rotateMode
		}, Rf.prototype.addRotation = function(B, e) {
			return "batch" === e ? this._addRotationInBatchMode(B) : "block" === e ? this._addRotationInBlockMode(B) : void 0
		}, Rf.prototype._addRotationInBlockMode = function(R) {
			var Z = this,
				b = Z.rotateCenter || Z.getPosition();
			Z._entities.forEach(function(p) {
				if(Z.isNode(p)) {
					var d = p.getMatrix();
					d.translate(-b.x, -b.y), d.rotate(R), d.translate(b.x, b.y);
					var E = Math.sign(p.getScale().x);
					p.setRotation(c(d.b * E, d.a * E)), p.setPosition(d.tx, d.ty)
				}
			})
		}, Rf.prototype._addRotationInBatchMode = function(J) {
			var E = this,
				z = E._anchor2;
			E._entities.forEach(function(y) {
				if(E.isNode(y)) {
					var j = y.getAnchor(),
						R = y.getMatrix(),
						W = R.tf({
							x: y.getWidth() * (z.x - j.x),
							y: y.getHeight() * (z.y - j.y)
						}),
						k = new ss.Math.Matrix2;
					k.set(R.a, R.b, R.c, R.d, R.tx, R.ty), k.translate(-W.x, -W.y), k.rotate(J), k.translate(W.x, W.y);
					var A = Math.sign(y.getScale().x);
					y.setRotation(c(k.b * A, k.a * A)), y.setPosition(k.tx, k.ty)
				}
			})
		}, Rf.prototype.setPosition = function(u) {
			var e, m, i, Y, w = this,
				W = w._position,
				G = u.x - W.x,
				H = u.y - W.y,
				E = w._entities;
			for(m = 0, i = E.length; i > m; m++) e = E[m], mm(e) && (Y = e.getPosition(), e.setPosition(Y.x + G, Y.y + H));
			w._position = u
		}, Rf.prototype.setScale = function(y, I) {
			var n = this,
				E = y / n._scale.x,
				D = I / n._scale.y;
			n._adjustChildScaleOrSize(E, D, "size"), n._scale = {
				x: y,
				y: I
			}
		}, Rf.prototype.getRect = function() {
			var Q = this,
				E = Q._position,
				_ = Q._width,
				X = Q._height;
			return {
				x: E.x - _ / 2,
				y: E.y - X / 2,
				width: _,
				height: X
			}
		}, Rf.prototype.setSize = function(x, d) {
			var B = this,
				x = Math.max(1, x),
				d = Math.max(1, d),
				e = x / B._width,
				L = d / B._height;
			B._adjustChildScaleOrSize(e, L, "size"), B._width = x, B._height = d
		}, Rf.prototype._adjustChildScaleOrSize = function(J, F, I) {
			var e, S, E, r, y, Q, _, x, u, g, L, H, f, Y, w = this,
				R = w._position,
				p = w._entities,
				o = new ss.Math.Matrix2;
			for(S = 0, E = p.length; E > S; S++)
				if(e = p[S], w.isNode(e)) {
					if(r = e.getPosition(), y = e.getRotation(), Q = e.getWidth(), _ = e.getHeight(), x = e.getScale(), L = x.x * Q, H = x.y * _, o.identity().scale(L, H).rotate(y).translate(r.x, r.y).translate(-R.x, -R.y).rotate(-w._64O), y = c(o.b * Math.sign(L), o.a * Math.sign(L)), o.scale(J, F), u = Math.cos(y), g = Math.sin(y), Math.abs(u) < .001 ? (f = o.b / g, Y = -o.c / g) : (f = o.a / u, Y = o.d / u), "scale" === I) e.setScale(f / Q, Y / _);
					else if("size" === I) {
						var k = f / x.x,
							D = Y / x.y;
						e.setScale(id(f) * Math.abs(x.x), id(Y) * Math.abs(x.y)), e.setSize(Math.max(.1, Math.abs(k)), Math.max(.1, Math.abs(D)))
					}
					o.rotate(w._64O).translate(R.x, R.y), e.setPosition(o.tx, o.ty)
				}
		}, Rf.prototype.getMatrix = function() {
			var V = this,
				d = V._position,
				Z = z.Default.getInternal(),
				b = V._scale;
			return new Z.Mat(V._64O, d.x, d.y, b.x, b.y)
		}, Rf.prototype.getCorners = function() {
			var k = this,
				X = k._width,
				h = k._height,
				J = k._anchor,
				M = -X * J.x,
				P = -h * J.y,
				y = k.getMatrix();
			return [y.tf(M, P), y.tf(M, P + h), y.tf(M + X, P + h), y.tf(M + X, P)]
		}, Rf.prototype.calcInfo = function() {
			var e, D, n, P, o, L, C = this,
				s = [],
				V = C._entities,
				k = C._64O;
			for(P = 0, o = V.length; o > P; P++) L = V[P], C.isNode(L) && L.getCorners && s.push.apply(s, L.getCorners());
			if(s.length) {
				var H = Math.cos(-k),
					J = Math.sin(-k),
					x = 1 / 0,
					z = -1 / 0,
					M = 1 / 0,
					y = -1 / 0;
				for(P = 0, o = s.length; o > P; P++) n = s[P], e = n.x, D = n.y, n.x = H * e - J * D, n.y = J * e + H * D, x = Math.min(x, n.x), z = Math.max(z, n.x), M = Math.min(M, n.y), y = Math.max(y, n.y);
				C._width = (z - x) / C._scale.x, C._height = (y - M) / C._scale.y, H = Math.cos(k), J = Math.sin(k);
				var _ = C._anchor;
				e = x + (z - x) * _.x, D = M + (y - M) * _.y, C._position = {
					x: H * e - J * D,
					y: J * e + H * D
				}
			}
		}, Rf.prototype.isNode = function(R) {
			return mm(R) ? Ef(R) ? !1 : !0 : !1
		}, Rf.prototype._42 = function(m, f, k) {
			var H, j, Q, w, B, q, J, N, $ = this,
				K = $._entities,
				L = $.rotateMode;
			for("batch" === L && (N = $.getKeyOb()), H = 0, j = K.length; j > H; H++) Q = K[H], $.isNode(Q) && (q = Q.getRect(), w = ss.toScreenPosition(k, {
				x: q.x,
				y: q.y
			}), B = ss.toScreenPosition(k, {
				x: q.x + q.width,
				y: q.y + q.height
			}), J = {
				min: w,
				max: B
			}, Q === N && (J.isKeyOb = !0), ss.Icons.DrawIcon(m, f, ss.Icons.GroupSubEntityRect, J))
		};
		var Xm = ss.CurveActiving = function(k, v) {
			this._curve = k, this._interactor = k._interactor;
			for(var h in v) this[h] = v[h]
		};
		Xm.prototype = {}, Xm.prototype.constructor = Xm, f.defineProperties(Xm.prototype, {
			point: {
				get: function() {
					return this._point
				},
				set: function(i) {
					var m = this;
					m._point = i, m.editingCtrl || m._firePointChange()
				}
			},
			pairs: {
				get: function() {
					return this._pairs
				},
				set: function(W) {
					var U = this;
					U._pairs = W, U.editingCtrl && U._firePointChange()
				}
			}
		}), Xm.prototype._firePointChange = function() {
			var V = this,
				E = V.getCurrentEditingPoint();
			if(!E) return i.fi({
				kind: "selectPoint"
			}), void 0;
			var i = V._interactor,
				d = this._curve.target;
			if(d) {
				var R = ss.getDataMatrix(d).invert(),
					H = E.e;
				E = R.apply(ss.toWorldPosition(i.gv, E)), E.e = H;
				var f = V._lastFirePoint;
				f && Math.abs(E.x - f.x) < 1e-5 && Math.abs(E.y - f.y) < 1e-5 && (E.e == S && f.e == S || Math.abs(E.e - f.e) < 1e-5) || (V._lastFirePoint = E, i.fi({
					kind: "selectPoint",
					x: E.x,
					y: E.y,
					e: E.e
				}))
			}
		}, Xm.prototype.dispose = function() {
			this._interactor.fi({
				kind: "selectPoint"
			})
		}, Xm.prototype.getCurrentEditingPoint = function() {
			var W = this,
				P = W.editingCtrl;
			if(P) {
				var N = W.pairs;
				if(N) {
					var y = N[P.pairId],
						J = y[P.type];
					if(J) return J
				}
			}
			return W._point
		};
		var Sl = ss.CursorFactory = function(N) {
			var U = this;
			U._interactor = N, U._rotateCursorStyles = {}
		};
		Sl.prototype = {}, Sl.prototype.constructor = Sl, Sl.prototype.getRotateCursor = function(F) {
			var U = this;
			0 > F && (F += 2 * Math.PI);
			var y = U._interactor,
				N = y.getStyle("rotateCursorSize"),
				w = y.getStyle("rotateCursorRound"),
				J = Math.round(180 * (F / Math.PI) / w);
			J * w >= 360 && (J = 0);
			var G = U._rotateCursorStyles,
				t = "htCustomRotateStyle_" + N + "_" + w + "_" + J;
			return G[t] || (U._produceRotateCursor(t, N, w, J), G[t] = !0), t
		}, Sl.prototype._produceRotateCursor = function(B, X, M, V) {
			var H = this;
			H._interactor;
			var c = H._canvas;
			c || (c = H._canvas = r.createElement("canvas")), c.width = c.height = X * devicePixelRatio, c.style.width = c.style.height = X + " px";
			var K = c.getContext("2d");
			ss.setAntialias(K, !1), K.scale(devicePixelRatio, devicePixelRatio);
			var j, l, a, Z, t, m = Math.round(X / 2),
				h = "" + m + " " + m + ",auto !important;";
			j = Math.PI / 180 * V * M, K.clearRect(0, 0, X, X), K.save(), K.scale(X / 32, X / 32), K.translate(16, 16), K.rotate(j + Math.PI / 2), K.beginPath(), K.moveTo(-8, 0), K.lineTo(-8, 3), K.lineTo(-5, 3), K.moveTo(8, 0), K.lineTo(8, 3), K.lineTo(5, 3), K.moveTo(-8, 3), K.quadraticCurveTo(0, -6, 8, 3), K.restore(), K.strokeStyle = "white", K.lineWidth = 4, K.stroke(), K.strokeStyle = "black", K.lineWidth = 2, K.stroke(), l = JSON.stringify(c.toDataURL()), Z = "cursor:url(" + l + ")" + h, 1 !== devicePixelRatio && (a = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="' + X + 'px" height="' + X + 'px"><image xlink:href=' + l + ' width="' + X + '" height="' + X + '"/></svg>', Z += "cursor:url(data:image/svg+xml;base64," + btoa(a) + ")" + h, Z += "cursor:-webkit-image-set(url(" + l + ")" + devicePixelRatio + "x,url(" + l + ")1x)" + h), t = r.createElement("style"), t.textContent = "body." + B + " *, ." + B + "{" + Z + "}", r.head.appendChild(t)
		};
		var Xc = ss.Guide.Grid = function($) {
			var W = this;
			W._interactor = $, W._alignmentGuideId = 0, W._xAlignmentGuide = [], W._yAlignmentGuide = []
		};
		Xc.prototype = {}, Xc.prototype.constructor = Xc, f.defineProperties(Xc.prototype, {
			gridBlockSize: {
				get: function() {
					var D = this;
					return D._gridBlockSize || D._interactor.getStyle("gridBlockSize")
				},
				set: function(Z) {
					this._gridBlockSize = Z, this._interactor._42()
				}
			},
			gridThickLinesEvery: {
				get: function() {
					var o = this;
					return o._gridThickLinesEvery || o._interactor.getStyle("gridThickLinesEvery")
				},
				set: function(Y) {
					this._gridThickLinesEvery = Y, this._interactor._42()
				}
			},
			gridEnabled: {
				get: function() {
					var m = this,
						H = m._interactor;
					return H.gridEnabled && m.isValidGrid()
				}
			}
		}), Xc.prototype._42 = function() {
			var o = this,
				N = o._interactor;
			o.gridEnabled && o.drawGrid(), N.alignmentGuideEnabled && o.drawAlignmentGuide()
		}, Xc.prototype.makeMatrix = function() {
			var f = this,
				R = f._interactor.getStyle("gridAngle"),
				W = f._interactor.getStyle("gridRotation"),
				X = new ss.Math.Matrix2,
				B = Math.sin(R),
				T = Math.cos(R);
			return X.set(1, 0, T, B, 0, 0), X.rotate(W), X
		}, Xc.prototype.isValidGrid = function() {
			var h = this,
				y = Math.PI,
				N = h._interactor,
				Z = N.gv;
			if(Z._zoom < N.getStyle("gridZoomThreshold")) return !1;
			var _ = N.getStyle("gridAngle"),
				W = Math.abs(180 * (_ % y / y)),
				m = 1 - 1e-8;
			return m > W || W > 180 - m ? !1 : !0
		}, Xc.prototype.drawAlignmentGuide = function() {
			var v = this,
				m = v._interactor,
				$ = m.gv,
				X = m._canvas,
				r = m._context,
				B = X.width,
				Y = X.height,
				G = $.tx(),
				e = $.ty(),
				N = $._zoom;
			r.beginPath(), r.strokeStyle = m.getStyle("gridAlignmentGuideColor"), r.lineWidth = 1, v._xAlignmentGuide.forEach(function(w) {
				var n = w.p * N + G;
				r.moveTo(n, 0), r.lineTo(n, Y)
			}), v._yAlignmentGuide.forEach(function(Z) {
				var Y = Z.p * N + e;
				r.moveTo(0, Y), r.lineTo(B, Y)
			}), r.stroke()
		}, Xc.prototype.drawGrid = function() {
			function q(c, I, O, E) {
				var T = ss.toScreenPosition(k, V.apply({
						x: c,
						y: I
					})),
					p = ss.toScreenPosition(k, V.apply({
						x: O,
						y: E
					}));
				D.moveTo(T.x, T.y), D.lineTo(p.x, p.y)
			}
			var K = this,
				G = K._interactor,
				J = K.gridBlockSize,
				b = K.gridThickLinesEvery,
				h = G.getStyle("gridThickColor"),
				i = G.getStyle("gridLightColor"),
				k = G.gv,
				A = G._canvas,
				D = G._context,
				Y = A.width,
				I = A.height,
				V = K.makeMatrix(),
				O = V.applyInverse(ss.toWorldPosition(k, {
					x: 0,
					y: 0
				})),
				Z = V.applyInverse(ss.toWorldPosition(k, {
					x: Y,
					y: 0
				})),
				z = V.applyInverse(ss.toWorldPosition(k, {
					x: 0,
					y: I
				})),
				f = V.applyInverse(ss.toWorldPosition(k, {
					x: Y,
					y: I
				})),
				d = Math.min(O.x, Z.x, z.x, f.x),
				N = Math.max(O.x, Z.x, z.x, f.x),
				e = Math.min(O.y, Z.y, z.y, f.y),
				R = Math.max(O.y, Z.y, z.y, f.y);
			Y = N - d, I = R - e;
			var t = Math.ceil(d / J),
				_ = Math.floor(N / J),
				X = Math.ceil(e / J),
				j = Math.floor(R / J);
			k.tx(), k.ty(), k._zoom;
			var S, B, m;
			for(D.save(), D.lineWidth = 1, D.beginPath(), D.strokeStyle = h, m = Math.ceil(t / b) * b; _ >= m; m += b) S = m * J, q(S, e, S, R);
			for(m = Math.ceil(X / b) * b; j >= m; m += b) B = m * J, q(d, B, N, B);
			for(D.stroke(), D.beginPath(), D.strokeStyle = i, m = t; _ >= m; m++) 0 !== m % b && (S = m * J, q(S, e, S, R));
			for(m = X; j >= m; m++) 0 !== m % b && (B = m * J, q(d, B, N, B));
			D.stroke(), D.restore()
		}, Xc.prototype.getAlignmentGuides = function() {
			var d = this;
			return {
				x: d._xAlignmentGuide,
				y: d._yAlignmentGuide
			}
		}, Xc.prototype.addAlignmentGuide = function(f, X, A) {
			var C = this,
				V = "x" === f ? C._xAlignmentGuide : C._yAlignmentGuide,
				A = A ? A : ++C._alignmentGuideId,
				n = {
					p: X,
					id: A
				};
			if(V.length) {
				var q = C._findClosestAlignmentGuide(n.p, V);
				q.dis < 0 ? V.splice(q.index + 1, 0, n) : V.splice(q.index, 0, n)
			} else V.push(n);
			return C._interactor._42(), A
		}, Xc.prototype.findClosest = function(h, w, X) {
			var R = this,
				K = R._interactor,
				G = K.gv;
			X && (h = ss.toWorldPosition(G, h));
			var e, n, W, A = 1 / 0,
				g = 1 / 0,
				o = h.x,
				L = h.y;
			if(R.gridEnabled) {
				var y = R.gridBlockSize,
					E = R.makeMatrix(),
					Z = E.applyInverse(h);
				Z = E.apply({
					x: Math.round(Z.x / y) * y,
					y: Math.round(Z.y / y) * y
				}), A = Z.x - o, g = Z.y - L, W = !0
			}
			if(K.alignmentGuideEnabled && (e = R._findClosestAlignmentGuide(o, R._xAlignmentGuide).dis, n = R._findClosestAlignmentGuide(L, R._yAlignmentGuide).dis, Math.abs(e) < Math.abs(A) && (A = e, W = !0), Math.abs(n) < Math.abs(g) && (g = n, W = !0)), W) {
				W = !1;
				var M = G._zoom,
					m = K.getStyle("smartGuideSensitivity") / M,
					z = {};
				if(Math.abs(A) < m && "y" !== w && (z.x = X ? A * M : A, W = !0), Math.abs(g) < m && "x" !== w && (z.y = X ? g * M : g, W = !0), W) return z
			}
		}, Xc.prototype._findClosestAlignmentGuide = function(t, E) {
			if(!E.length) return {
				dis: 1 / 0
			};
			for(var D, C = 0, $ = E.length - 1; $ - C > 1;) D = Math.floor((C + $) / 2), E[D].p < t ? C = D : $ = D;
			var J = E[C].p - t,
				A = E[$].p - t;
			return Math.abs(J) <= Math.abs(A) ? {
				line: E[C],
				dis: J,
				index: C
			} : {
				line: E[$],
				dis: A,
				index: $
			}
		}, Xc.prototype.removeAllAlignmentGuide = function(f) {
			var $ = this;
			"y" !== f && ($._xAlignmentGuide = []), "x" !== f && ($._yAlignmentGuide = []), $._interactor._42()
		}, Xc.prototype.removeAlignmentGuide = function(u) {
			for(var b, V, n, j = this, x = j._xAlignmentGuide, O = 0; 2 > O; O++)
				for(x = 0 === O ? j._xAlignmentGuide : j._yAlignmentGuide, b = 0, V = x.length; V > b; b++)
					if(n = x[b], n.id === u) return x.splice(b, 1), j._interactor._42(), {
						axis: 0 === O ? "x" : "y",
						position: n.p
					};
			return !1
		}, Xc.prototype.adjustAlignmentGuide = function(b, u) {
			var q = this,
				c = q.removeAlignmentGuide(b);
			return c ? (q.addAlignmentGuide(c.axis, u, b), !0) : !1
		};
		var Am = ss.Guide.Rect = function(Q) {
			var e = this;
			e._interactor = Q
		};
		Am.prototype = {}, Am.prototype.constructor = Am, Am.prototype.gatherRects = function() {
			var Q, V, m, d, z = this,
				i = z._interactor.gv,
				c = [],
				X = [],
				B = {
					x: c,
					y: X
				},
				b = {},
				Y = i.getDataModel(),
				g = Y.a("width"),
				x = Y.a("height");
			g && x && (Q = 0, V = 0, m = g, d = x, c.push({
				node: Y,
				type: 0,
				p: Q
			}, {
				node: Y,
				type: 1,
				p: Q + m / 2
			}, {
				node: Y,
				type: 2,
				p: Q + m
			}), X.push({
				node: Y,
				type: 0,
				p: V
			}, {
				node: Y,
				type: 1,
				p: V + d / 2
			}, {
				node: Y,
				type: 2,
				p: V + d
			}), b[Y._id || 0] = {
				x: Q,
				y: V,
				width: m,
				height: d
			}), Y.each(function(A) {
				if(mm(A) && !i.isSelected(A) && i.isVisible(A)) {
					var J = !1;
					if(i.sm().getSelection().each(function($) {
							J || (A.isHostOn($) ? J = !0 : A.isDescendantOf($) && (J = !0))
						}), !J) {
						var o = A.getRect();
						Q = o.x, V = o.y, m = o.width, d = o.height, c.push({
							node: A,
							type: 0,
							p: Q
						}, {
							node: A,
							type: 1,
							p: Q + m / 2
						}, {
							node: A,
							type: 2,
							p: Q + m
						}), X.push({
							node: A,
							type: 0,
							p: V
						}, {
							node: A,
							type: 1,
							p: V + d / 2
						}, {
							node: A,
							type: 2,
							p: V + d
						}), b[A._id] = o
					}
				}
			}), c.sort(function(_, E) {
				return _.p - E.p
			}), X.sort(function(i, W) {
				return i.p - W.p
			}), z._grid = B, z._87I = b
		}, Am.prototype.gatherLines = function(I, e, p) {
			var v, x, X, $, Z, O, T, K, U, C, B, D, h = this,
				j = [h.findClosest({
					x: I.x,
					y: I.y
				}, e), h.findClosest({
					x: I.x + I.w / 2,
					y: I.y + I.h / 2
				}, e), h.findClosest({
					x: I.x + I.w,
					y: I.y + I.h
				}, e)],
				b = {},
				A = h._87I;
			p = p || 255;
			var n, Q;
			for(h._guideLine = [], v = 0; 2 > v; v++)
				for(b = {}, 0 === v ? ($ = "y", K = I.x, U = K + I.w) : ($ = "x", K = I.y, U = K + I.h), x = 0; 3 > x; x++) Z = j[x], Z && isFinite(Z[$]) && (n = 1 << 3 * v + x, p & n && (O = Z[$ + "Line"], T = O.node, Q = T._id || 0, b[Q] || (b[Q] = !0, D = A[Q], "y" === $ ? (C = D.x, B = D.x + D.width) : (C = D.y, B = D.y + D.height), X = O.p, h._guideLine.push({
					type: $,
					a: K,
					b: U,
					c: C,
					d: B,
					p: X
				}))))
		}, Am.prototype._binarySearchClosest = function(t, Y) {
			if(!Y.length) return {
				dis: 1 / 0
			};
			for(var q, v = 0, l = Y.length - 1; l - v > 1;) q = Math.floor((v + l) / 2), Y[q].p < t ? v = q : l = q;
			var k = Y[v].p - t,
				P = Y[l].p - t;
			return Math.abs(k) <= Math.abs(P) ? {
				line: Y[v],
				dis: k
			} : {
				line: Y[l],
				dis: P
			}
		}, Am.prototype.findClosest = function(E, K, l) {
			var q = this,
				J = q._interactor,
				O = J.gv,
				H = q._grid;
			l && (E = ss.toWorldPosition(O, E));
			var R, A = q._binarySearchClosest(E.x, H.x),
				T = q._binarySearchClosest(E.y, H.y),
				D = A.dis,
				x = T.dis,
				m = O._zoom,
				w = J.getStyle("smartGuideSensitivity") / m,
				b = {};
			return Math.abs(D) < w && "y" !== K && (b.x = l ? D * m : D, b.xLine = A.line, R = !0), Math.abs(x) < w && "x" !== K && (b.y = l ? x * m : x, b.yLine = T.line, R = !0), R ? b : void 0
		}, Am.prototype._42 = function() {
			var Y = this,
				X = Y._guideLine;
			if(X && !z.Default.isCtrlDown()) {
				var U, S, d, Q, i, n, r, q, C, a, s, t, e, I, h, c, A, j = Y._interactor,
					g = j.gv,
					J = j._context,
					o = g.tx(),
					y = g.ty(),
					m = g._zoom,
					T = j.getStyle("guideLineTextSpacing");
				for(U = 0, S = X.length; S > U; U++) d = X[U], q = d.type, C = d.p, a = d.a, s = d.b, t = d.c, e = d.d, I = Math.min(a, t), h = Math.max(s, e), "x" === q ? (Q = C * m + o, i = I * m + y, n = Q, r = h * m + y) : (Q = I * m + o, i = C * m + y, n = h * m + o, r = i), ss.Icons.DrawIcon(j, J, ss.Icons.MoveLineGuide, [Q, i, n, r]), e >= a && s >= t || (I = a > e ? e : s, h = a > e ? a : t, A = h - I, "x" === q ? (d.center2center || (Q -= T, n = Q), i = I * m + y, r = h * m + y, c = ss.Icons.MoveLineGuideDistanceV) : "y" === q && (d.center2center || (i -= T, r = i), Q = I * m + o, n = h * m + o, c = ss.Icons.MoveLineGuideDistanceH), ss.Icons.DrawIcon(j, J, c, {
					x0: Q,
					y0: i,
					x1: n,
					y1: r,
					dis: A
				}))
			}
		}, Am.prototype.clear = function() {
			this._guideLine = null
		}, ss.DefaultStyleMap = {
			pointSize: [24, 9],
			checkSize: 7,
			rotateCheckSize: 10,
			moveSensitivity: 10,
			rotateRound: Math.PI / 2,
			rotateSensitivity: Math.PI / 60,
			shiftRotateRound: Math.PI / 12,
			shiftLineRotateRound: Math.PI / 4,
			anchorMovable: !0,
			anchorVisible: !0,
			anchorHideThreshold: 25,
			anchorOutsideVisibleThreshold: .25,
			anchorRound: .25,
			anchorSensitivity: .02,
			smartGuideSensitivity: 8,
			curveIntersectSize: 5,
			curvePointIntersectSize: 8,
			edgeHostDetectPerFrame: !0,
			guideLineTextSpacing: 32,
			gridBlockSize: 40,
			gridThickLinesEvery: 10,
			gridThickColor: "#5d5d5d",
			gridLightColor: "#d0d0d0",
			gridZoomThreshold: .25,
			gridAlignmentGuideColor: "#ff0000",
			gridAngle: Math.PI / 2,
			gridRotation: 0,
			groupRotateModeDefault: "block",
			groupRotateModeKey: ["ctrlKey", "metaKey"],
			rotateCursorSize: 32,
			rotateCursorRound: 45,
			tipTextColor: "#ffffff",
			tipBackground: "#333333",
			curveHighlightColor: "#30599e",
			rectPointBackground: "white",
			rectPointBorderColor: "#666666",
			rectPointShadowColor: "rgba(0,0,0,0.35)",
			shapeCtrlPointBackground: "white",
			shapeCtrlPointBorderColor: "#707070",
			shapeCtrlPointHighlightBorder: "black",
			shapeHighlighPointBackground: "#30599e",
			curveElevationVisible: !0,
			curveElevationIntersectSize: 8,
			curveElevationGuideShift: [20, 0],
			connectGuideVisible: !0,
			connectGuideShift: [1, .25, 8, 0],
			connectGuideIntersectSize: 8,
			connectGuideGarbageIntersectsize: 25,
			connectGuideGarbageShift: [1, 1, -48, -48]
		};
		var hs = ss.Icons = {},
			Ze = 1e4,
			Rg = null,
			ii = 8;
		z.Default.setImage("Icons.RectPoint", {
			width: ii,
			height: ii,
			comps: [{
				type: "shape",
				points: [0, 0, 0, ii, ii, ii, ii, 0],
				segments: [1, 2, 2, 2, 5],
				shadow: !0,
				borderWidth: 1,
				shadowColor: {
					func: function() {
						return Rg.getStyle("rectPointShadowColor")
					}
				},
				background: {
					func: function() {
						return Rg.getStyle("rectPointBackground")
					}
				},
				borderColor: {
					func: function() {
						return Rg.getStyle("rectPointBorderColor")
					}
				}
			}]
		});
		var hm = "#e000e0";
		hs.GroupSubEntityRect = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						var R = hs.GroupSubEntityRect.data;
						if(!R) return [];
						var w = R.min,
							l = R.max;
						return [w.x, w.y, w.x, l.y, l.x, l.y, l.x, w.y]
					}
				},
				segments: [1, 2, 2, 2, 5],
				background: null,
				borderWidth: 1,
				borderColor: {
					func: function() {
						return hs.GroupSubEntityRect.data.isKeyOb ? hm : "#666666"
					}
				}
			}]
		}, hs.Line = {
			comps: [{
				type: "image",
				name: "Icons.RectPoint",
				rect: {
					func: function() {
						return [
							[hs.Line.data.P1.x, hs.Line.data.P1.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				rect: {
					func: function() {
						return [
							[hs.Line.data.P2.x, hs.Line.data.P2.y], ii, ii
						]
					}
				}
			}]
		}, hs.NodeHoverGuide = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						return hs.NodeHoverGuide.data
					}
				},
				segments: [1, 2, 2, 2, 5],
				background: null,
				borderWidth: 1,
				borderColor: "#3399FF"
			}]
		}, hs.Rect = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						var V = hs.Rect.data;
						if(!V) return [];
						var w = V.LT,
							q = V.LB,
							p = V.RB,
							u = V.RT;
						return [w.x, w.y, q.x, q.y, p.x, p.y, u.x, u.y]
					}
				},
				segments: [1, 2, 2, 2, 5],
				background: null,
				borderWidth: 1,
				borderColor: "#666666"
			}, {
				type: "image",
				name: "Icons.RectPoint",
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.LT.x, hs.Rect.data.LT.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.LB.x, hs.Rect.data.LB.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.RB.x, hs.Rect.data.RB.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.RT.x, hs.Rect.data.RT.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				scaleX: .9,
				scaleY: .9,
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				visible: {
					func: function() {
						return hs.Rect.data.L ? !0 : !1
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.L.x, hs.Rect.data.L.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				scaleX: .9,
				scaleY: .9,
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				visible: {
					func: function() {
						return hs.Rect.data.R ? !0 : !1
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.R.x, hs.Rect.data.R.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				scaleX: .9,
				scaleY: .9,
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				visible: {
					func: function() {
						return hs.Rect.data.T ? !0 : !1
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.T.x, hs.Rect.data.T.y], ii, ii
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.RectPoint",
				scaleX: .9,
				scaleY: .9,
				rotation: {
					func: function() {
						return hs.Rect.data.rotation
					}
				},
				visible: {
					func: function() {
						return hs.Rect.data.B ? !0 : !1
					}
				},
				rect: {
					func: function() {
						return [
							[hs.Rect.data.B.x, hs.Rect.data.B.y], ii, ii
						]
					}
				}
			}]
		};
		var Aq = 18;
		z.Default.setImage("Icons.Anchor", {
			width: Aq,
			height: Aq,
			comps: [{
				type: "arc",
				rect: [4, 4, Aq - 8, Aq - 8],
				arcFrom: 0,
				arcClose: !1,
				background: "#ffffff",
				borderWidth: 0,
				borderColor: "#000000"
			}, {
				type: "shape",
				points: [2, Aq / 2, Aq - 2, Aq / 2, Aq / 2, 2, Aq / 2, Aq - 2],
				segments: [1, 2, 1, 2],
				background: null,
				borderWidth: 1,
				borderColor: "#111111"
			}, {
				type: "arc",
				rect: [5.5, 5.5, Aq - 11, Aq - 11],
				arcFrom: 0,
				arcClose: !1,
				background: null,
				borderWidth: 1,
				borderColor: "#111111"
			}]
		}), hs.Anchor = {
			comps: [{
				type: "image",
				name: "Icons.Anchor",
				rect: {
					func: function() {
						return [
							[hs.Anchor.data.POS.x, hs.Anchor.data.POS.y], Aq, Aq
						]
					}
				}
			}]
		}, hs.TipShiftX = 12, hs.TipShiftY = 12;
		var qs = [8, 28];
		hs.TipHelper = {
			comps: [{
				type: "roundRect",
				rect: {
					func: function() {
						return [hs.TipHelper.data.helperPos.x, hs.TipHelper.data.helperPos.y, qs[0] * hs.TipHelper.data.size, qs[1]]
					}
				},
				background: {
					func: function() {
						return Rg.getStyle("tipBackground")
					}
				},
				opacity: .6
			}, {
				type: "text",
				text: {
					func: function() {
						return hs.TipHelper.data.text
					}
				},
				rect: {
					func: function() {
						return [hs.TipHelper.data.helperPos.x, hs.TipHelper.data.helperPos.y, qs[0] * hs.TipHelper.data.size, qs[1]]
					}
				},
				color: {
					func: function() {
						return Rg.getStyle("tipTextColor")
					}
				},
				font: "bold 12px Arial",
				align: "center"
			}]
		};
		var Gg = 7;
		hs.ShapePoint = {
			comps: [{
				type: "circle",
				rect: {
					func: function() {
						var i = hs.ShapePoint.data;
						return [i, Gg, Gg]
					}
				},
				background: "#ffffff",
				borderWidth: 1,
				borderColor: "#333333"
			}]
		}, hs.ShapeBgCurve = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						return hs.ShapeBgCurve.data.P
					}
				},
				segments: {
					func: function() {
						return hs.ShapeBgCurve.data.S
					}
				},
				background: null,
				borderWidth: 1,
				borderColor: "#333333"
			}]
		};
		var ce = 8;
		hs.ShapeHighlighPoint = {
			comps: [{
				type: "circle",
				rect: {
					func: function() {
						var x = hs.ShapeHighlighPoint.data;
						return [
							[x.x, x.y], ce, ce
						]
					}
				},
				background: {
					func: function() {
						return Rg.getStyle("shapeHighlighPointBackground")
					}
				},
				borderWidth: 0
			}]
		};
		var fs = 10;
		hs.ShapeHighlighRealPoint = {
			comps: [{
				type: "circle",
				rect: {
					func: function() {
						var C = hs.ShapeHighlighRealPoint.data;
						return [
							[C.x, C.y], fs, fs
						]
					}
				},
				background: "#ffffff",
				borderWidth: 2,
				borderColor: "#333333"
			}]
		};
		var pr = 8;
		hs.ShapeHighlighCtrlPoint = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						var G = hs.ShapeHighlighCtrlPoint.data,
							c = G.x,
							V = G.y,
							y = pr / 2;
						return [c - y, V - y, c - y, V + y, c + y, V + y, c + y, V - y]
					}
				},
				segments: [1, 2, 2, 2, 5],
				borderWidth: 2,
				background: {
					func: function() {
						return Rg.getStyle("shapeCtrlPointBackground")
					}
				},
				borderColor: {
					func: function() {
						return Rg.getStyle("shapeCtrlPointBorderColor")
					}
				}
			}]
		};
		var cm = 3;
		hs.ShapeHighlightCurve = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						return hs.ShapeHighlightCurve.data
					}
				},
				segments: [1, 4],
				background: null,
				borderWidth: cm,
				borderColor: {
					func: function() {
						return Rg.getStyle("curveHighlightColor")
					}
				}
			}]
		}, hs.ShapeGuideLine = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						return hs.ShapeGuideLine.data
					}
				},
				background: null,
				borderWidth: 1,
				borderColor: "red"
			}]
		}, hs.MoveLineGuide = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						return hs.MoveLineGuide.data
					}
				},
				background: null,
				borderWidth: 1,
				borderColor: "red"
			}]
		};
		var Ug = 5;
		hs.MoveLineGuideDistanceH = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						var L = hs.MoveLineGuideDistanceH.data,
							I = L.x0,
							T = L.y0,
							c = L.x1,
							M = L.y1;
						return [I, T, c, M, I, T - Ug, I, T + Ug, c, M - Ug, c, M + Ug]
					}
				},
				segments: [1, 2, 1, 2, 1, 2],
				background: null,
				borderWidth: 1,
				borderColor: "red"
			}, {
				type: "text",
				text: {
					func: function() {
						return Math.round(hs.MoveLineGuideDistanceH.data.dis)
					}
				},
				rect: {
					func: function() {
						var V = hs.MoveLineGuideDistanceH.data;
						return [
							[(V.x0 + V.x1) / 2, V.y0 - 10], 20, 20
						]
					}
				},
				color: "red",
				font: "12px Arial",
				align: "center"
			}]
		}, hs.MoveLineGuideDistanceV = {
			comps: [{
				type: "shape",
				points: {
					func: function() {
						var g = hs.MoveLineGuideDistanceV.data,
							M = g.x0,
							S = g.y0,
							N = g.x1,
							p = g.y1;
						return [M, S, N, p, M - Ug, S, M + Ug, S, N - Ug, p, N + Ug, p]
					}
				},
				segments: [1, 2, 1, 2, 1, 2],
				background: null,
				borderWidth: 1,
				borderColor: "red"
			}, {
				type: "text",
				text: {
					func: function() {
						return Math.round(hs.MoveLineGuideDistanceV.data.dis)
					}
				},
				rect: {
					func: function() {
						var e = hs.MoveLineGuideDistanceV.data;
						return [
							[e.x0 - 10, (e.y0 + e.y1) / 2], 20, 20
						]
					}
				},
				color: "red",
				font: "12px Arial",
				align: "center"
			}]
		}, z.Default.setImage("Icons.EdgeElevationGuideImage", {
			width: 16,
			height: 16,
			comps: [{
				type: "oval",
				background: "rgb(255,255,255)",
				borderWidth: 1,
				borderColor: "rgb(138,138,138)",
				rect: [.5, .5, 15, 15]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(44,44,44)",
				borderCap: "round",
				points: [4, 8, 8, 4, 12, 8, 8, 4, 8, 13],
				segments: [1, 2, 2, 1, 2]
			}]
		}), hs.EdgeElevationGuide = {
			comps: [{
				type: "image",
				name: "Icons.EdgeElevationGuideImage",
				rect: {
					func: function() {
						var o = hs.EdgeElevationGuide.data,
							T = o.x,
							a = o.y,
							e = Rg.getStyle("curveElevationIntersectSize"),
							p = Rg.getStyle("curveElevationGuideShift");
						return T += p[0], a += p[1], [T - e, a - e, 2 * e, 2 * e]
					}
				}
			}]
		}, z.Default.setImage("Icons.ConnectGuideBgImage", {
			width: 12,
			height: 12,
			comps: [{
				type: "shape",
				background: "#3399ff",
				fillRule: "evenodd",
				shadowColor: "#1ABC9C",
				rotation: 3.14159,
				points: [6.00001, 11.99999, 6.00001, 11.99999, 2.6863, 11.99999, 1e-5, 9.30695, 1e-5, 5.99999, 1e-5, 5.99999, 1e-5, 2.68628, 2.69305, -1e-5, 6.00001, -1e-5, 12.00001, -1e-5, 11.99998, 12.00001, 6.00001, 11.99999],
				segments: [1, 2, 4, 2, 4, 2, 2, 2]
			}]
		}), z.Default.setImage("Icons.ConnectGuideHeaderImage", {
			width: 12,
			height: 12,
			comps: [{
				type: "oval",
				background: "#3399FF",
				borderColor: "#3399FF",
				shadowColor: "#1ABC9C",
				rect: [0, 0, 12, 12]
			}, {
				type: "shape",
				borderWidth: 1,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [4.76, 2.56, 8.2, 5.98, 4.76, 9.44]
			}]
		}), hs.ConnectGuide = {
			comps: [{
				type: "image",
				name: "Icons.ConnectGuideBgImage",
				rotation: {
					func: function() {
						return hs.ConnectGuide.data.rotation
					}
				},
				rect: {
					func: function() {
						var O = hs.ConnectGuide.data.connect;
						O.x, O.y;
						var m = Rg.getStyle("connectGuideIntersectSize");
						return [
							[O.x, O.y], 2 * m, 2 * m
						]
					}
				}
			}, {
				type: "image",
				name: "Icons.ConnectGuideHeaderImage",
				rect: {
					func: function() {
						var y = hs.ConnectGuide.data.cursorPos || hs.ConnectGuide.data.connect,
							m = Rg.getStyle("connectGuideIntersectSize");
						return [
							[y.x, y.y], 2 * m - 2, 2 * m - 2
						]
					}
				}
			}, {
				type: "shape",
				background: null,
				borderColor: "#3399ff",
				borderWidth: 2,
				segments: [1, 4],
				points: {
					func: function() {
						var r = hs.ConnectGuide.data.connect,
							R = hs.ConnectGuide.data.cursorPos || r;
						return [r.x, r.y, r.x + .5 * (R.x - r.x), r.y, R.x + .5 * (r.x - R.x), R.y, R.x, R.y]
					}
				}
			}]
		}, z.Default.setImage("Icons.ConnectGuideGarbageImage", {
			width: 48,
			height: 48,
			comps: [{
				type: "oval",
				background: "rgba(0,0,0,0.1)",
				borderColor: "#979797",
				shadowColor: "#1ABC9C",
				rect: [0, 0, 48, 48]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [19.84721, 19.69091, 19.84721, 32.25123]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [24.10371, 19.69091, 24.10371, 32.25123]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [28.15279, 19.69091, 28.15279, 32.25123]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [11.23055, 15.22377, 36.76945, 15.189, 19.12302, 15.17121, 20.94722, 11.5228, 26.41985, 11.5228, 28.24406, 15.17121]
			}, {
				type: "rect",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				shadowColor: "#1ABC9C",
				rect: [15.48702, 15.22377, 17.02595, 21.25344]
			}]
		}), z.Default.setImage("Icons.ConnectGuideDeletingImage", {
			width: 56,
			height: 56,
			comps: [{
				type: "oval",
				background: "rgba(232,0,0,0.75)",
				borderColor: "#979797",
				shadowColor: "#1ABC9C",
				rect: [0, 0, 56, 56]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [22.67939, 27.69091, 22.67939, 40.25123]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [26.93588, 27.69091, 26.93588, 40.25123]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				points: [30.98497, 27.69091, 30.98497, 40.25123]
			}, {
				type: "shape",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				borderCap: "round",
				shadowColor: "#1ABC9C",
				anchorX: 0,
				anchorY: 1,
				rotation: 5.65062,
				points: [14.06272, 23.22377, 39.60163, 23.189, 21.9552, 23.17121, 23.7794, 19.5228, 29.25203, 19.5228, 31.07623, 23.17121]
			}, {
				type: "rect",
				borderWidth: 2,
				borderColor: "rgb(255,255,255)",
				shadowColor: "#1ABC9C",
				rect: [18.3192, 23.22377, 17.02595, 21.25344]
			}]
		}), hs.ConnectGuideGarbage = {
			comps: [{
				type: "image",
				name: {
					func: function() {
						var f = hs.ConnectGuideGarbage.data.hover;
						return f ? "Icons.ConnectGuideDeletingImage" : "Icons.ConnectGuideGarbageImage"
					}
				},
				rect: {
					func: function() {
						var p = hs.ConnectGuideGarbage.data,
							r = Rg.getStyle("connectGuideGarbageIntersectsize");
						return p.hover && (r += 5), [
							[p.x, p.y], 2 * r, 2 * r
						]
					}
				}
			}]
		};
		var Ge = 6;
		hs.ShapeActivingCtrl = {
			comps: [{
				type: "shape",
				visible: {
					func: function() {
						return hs.ShapeActivingCtrl.data.c1 ? !0 : !1
					}
				},
				points: {
					func: function() {
						var N = hs.ShapeActivingCtrl.data;
						return [N.point.x, N.point.y, N.c1.x, N.c1.y]
					}
				},
				segments: [1, 2],
				background: null,
				borderWidth: 1,
				borderColor: "#707070"
			}, {
				type: "shape",
				visible: {
					func: function() {
						return hs.ShapeActivingCtrl.data.c2 ? !0 : !1
					}
				},
				points: {
					func: function() {
						var x = hs.ShapeActivingCtrl.data;
						return [x.point.x, x.point.y, x.c2.x, x.c2.y]
					}
				},
				segments: [1, 2],
				background: null,
				borderWidth: 1,
				borderColor: "#707070"
			}, {
				type: "shape",
				visible: {
					func: function() {
						return hs.ShapeActivingCtrl.data.c1 ? !0 : !1
					}
				},
				points: {
					func: function() {
						var Q = hs.ShapeActivingCtrl.data.c1,
							c = Q.x,
							C = Q.y,
							z = Ge / 2;
						return "c1" === hs.ShapeActivingCtrl.data.hl && (z += .5), [c - z, C - z, c - z, C + z, c + z, C + z, c + z, C - z]
					}
				},
				segments: [1, 2, 2, 2, 5],
				borderWidth: 2,
				background: {
					func: function() {
						return Rg.getStyle("shapeCtrlPointBackground")
					}
				},
				borderColor: {
					func: function() {
						return "c1" === hs.ShapeActivingCtrl.data.hl ? Rg.getStyle("shapeCtrlPointHighlightBorder") : Rg.getStyle("shapeCtrlPointBorderColor")
					}
				}
			}, {
				type: "shape",
				visible: {
					func: function() {
						return hs.ShapeActivingCtrl.data.c2 ? !0 : !1
					}
				},
				points: {
					func: function() {
						var b = hs.ShapeActivingCtrl.data.c2,
							o = b.x,
							V = b.y,
							m = Ge / 2;
						return "c2" === hs.ShapeActivingCtrl.data.hl && (m += .5), [o - m, V - m, o - m, V + m, o + m, V + m, o + m, V - m]
					}
				},
				segments: [1, 2, 2, 2, 5],
				borderWidth: 2,
				background: {
					func: function() {
						return Rg.getStyle("shapeCtrlPointBackground")
					}
				},
				borderColor: {
					func: function() {
						return "c2" === hs.ShapeActivingCtrl.data.hl ? Rg.getStyle("shapeCtrlPointHighlightBorder") : Rg.getStyle("shapeCtrlPointBorderColor")
					}
				}
			}]
		}, ss.Icons.DrawIcon = function(D, J, b, Q) {
			b.width = b.height = Ze, b.data = Q, Rg = D, z.Default.drawImage(J, b, 0, 0, Ze, Ze)
		}, ss.Icons.MapPoints = function(n, O) {
			for(var X = 0, B = n.length; B > X; X++) n[X] /= O
		}, ss.roundTo = function(c, S, g) {
			var M = Math.abs(c % S);
			return g > M || g > S - M ? S * Math.round(c / S) : c
		}, ss.toFixed = function(X) {
			return Math.round(100 * X) / 100
		}, ss.getDataMatrix = function(S) {
			if(S instanceof z.Shape) {
				var Z = new ss.Math.Matrix2,
					y = S.getPosition();
				return Z.translate(-y.x, -y.y).scale(S.getScale().x, S.getScale().y).rotate(S.getRotation()).translate(y.x, y.y), Z
			}
			return S.getMatrix ? S.getMatrix() : new ss.Math.Matrix2
		}, Math.sign === S && (Math.sign = function(v) {
			return 0 > v ? -1 : v > 0 ? 1 : +v
		});
		var Mb = ss.Math.Matrix2 = function() {
			this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.tx = 0, this.ty = 0
		};
		Mb.prototype = {}, Mb.prototype.constructor = Mb, Mb.prototype.set = function(M, J, T, F, c, k) {
			return this.a = M, this.b = J, this.c = T, this.d = F, this.tx = c, this.ty = k, this
		}, Mb.prototype.apply = function(Z, w) {
			w = w || new Jf;
			var H = Z.x,
				B = Z.y;
			return w.x = this.a * H + this.c * B + this.tx, w.y = this.b * H + this.d * B + this.ty, w
		}, Mb.prototype.applyInverse = function(E, S) {
			S = S || new Jf;
			var k = 1 / (this.a * this.d + this.c * -this.b),
				R = E.x,
				g = E.y;
			return S.x = this.d * k * R + -this.c * k * g + (this.ty * this.c - this.tx * this.d) * k, S.y = this.a * k * g + -this.b * k * R + (-this.ty * this.a + this.tx * this.b) * k, S
		}, Mb.prototype.translate = function(S, k) {
			return this.tx += S, this.ty += k, this
		}, Mb.prototype.scale = function(K, W) {
			return this.a *= K, this.d *= W, this.c *= K, this.b *= W, this.tx *= K, this.ty *= W, this
		}, Mb.prototype.rotate = function(j) {
			var a = Math.cos(j),
				J = Math.sin(j),
				V = this.a,
				m = this.c,
				B = this.tx;
			return this.a = V * a - this.b * J, this.b = V * J + this.b * a, this.c = m * a - this.d * J, this.d = m * J + this.d * a, this.tx = B * a - this.ty * J, this.ty = B * J + this.ty * a, this
		}, Mb.prototype.append = function(A) {
			var V = this.a,
				D = this.b,
				z = this.c,
				g = this.d;
			return this.a = A.a * V + A.b * z, this.b = A.a * D + A.b * g, this.c = A.c * V + A.d * z, this.d = A.c * D + A.d * g, this.tx = A.tx * V + A.ty * z + this.tx, this.ty = A.tx * D + A.ty * g + this.ty, this
		}, Mb.prototype.setTransform = function(I, c, P, p, K, k, u, Z, Q) {
			var F, Y, y, x, V, N, b, D, q, e;
			return V = Math.sin(u), N = Math.cos(u), b = Math.cos(Q), D = Math.sin(Q), q = -Math.sin(Z), e = Math.cos(Z), F = N * K, Y = V * K, y = -V * k, x = N * k, this.a = b * F + D * y, this.b = b * Y + D * x, this.c = q * F + e * y, this.d = q * Y + e * x, this.tx = I + (P * F + p * y), this.ty = c + (P * Y + p * x), this
		}, Mb.prototype.prepend = function(j) {
			var D = this.tx;
			if(1 !== j.a || 0 !== j.b || 0 !== j.c || 1 !== j.d) {
				var K = this.a,
					B = this.c;
				this.a = K * j.a + this.b * j.c, this.b = K * j.b + this.b * j.d, this.c = B * j.a + this.d * j.c, this.d = B * j.b + this.d * j.d
			}
			return this.tx = D * j.a + this.ty * j.c + j.tx, this.ty = D * j.b + this.ty * j.d + j.ty, this
		}, Mb.prototype.invert = function() {
			var l = this.a,
				_ = this.b,
				E = this.c,
				V = this.d,
				k = this.tx,
				U = l * V - _ * E;
			return this.a = V / U, this.b = -_ / U, this.c = -E / U, this.d = l / U, this.tx = (E * this.ty - V * k) / U, this.ty = -(l * this.ty - _ * k) / U, this
		}, Mb.prototype.identity = function() {
			return this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.tx = 0, this.ty = 0, this
		}, Mb.prototype.clone = function() {
			var U = new Mb;
			return U.a = this.a, U.b = this.b, U.c = this.c, U.d = this.d, U.tx = this.tx, U.ty = this.ty, U
		}, Mb.prototype.copy = function(m) {
			return m.a = this.a, m.b = this.b, m.c = this.c, m.d = this.d, m.tx = this.tx, m.ty = this.ty, m
		}, Mb.IDENTITY = new Mb, Mb.TEMP_MATRIX = new Mb;
		var Jf = ss.Math.Vector2 = function(v, O, k) {
			"object" == typeof v && (v.x != S ? (O = v.y, v = v.x, k = v.e) : (k = v[2], O = v[1], v = v[0])), this.set(v || 0, O || 0, k)
		};
		Jf.prototype = {}, Jf.prototype.constructor = Jf, f.defineProperties(Jf.prototype, {
			width: {
				get: function() {
					return this.x
				},
				set: function(u) {
					this.x = u
				}
			},
			height: {
				get: function() {
					return this.y
				},
				set: function(i) {
					this.y = i
				}
			}
		}), Jf.prototype.clone = function() {
			return new Jf(this.x, this.y, this.e)
		}, Jf.prototype.copy = function(T) {
			return this.set(T.x, T.y, T.e), this
		}, Jf.prototype.equals = function(q) {
			return q.x === this.x && q.y === this.y
		}, Jf.prototype.set = function(j, L, i) {
			return this.x = j || 0, this.y = L || (0 !== L ? this.x : 0), i != S && (this.e = i), this
		}, Jf.prototype.setScalar = function(y) {
			return this.x = y, this.y = y, this
		}, Jf.prototype.setX = function(f) {
			return this.x = f || 0, this
		}, Jf.prototype.setY = function(y) {
			return this.y = y || 0, this
		}, Jf.prototype.add = function(b) {
			return this.x += b.x, this.y += b.y, this
		}, Jf.prototype.addVectors = function(w, O) {
			return this.x = w.x + O.x, this.y = w.y + O.y, this
		}, Jf.prototype.addScalar = function(Q) {
			return this.x += Q, this.y += Q, this
		}, Jf.prototype.addScaledVector = function(J, n) {
			return this.x += J.x * n, this.y += J.y * n, this
		}, Jf.prototype.sub = function(b) {
			return this.x -= b.x, this.y -= b.y, this
		}, Jf.prototype.subScalar = function(p) {
			return this.x -= p, this.y -= p, this
		}, Jf.prototype.subVectors = function(T, $) {
			return this.x = T.x - $.x, this.y = T.y - $.y, this
		}, Jf.prototype.multiply = function(a) {
			return this.x *= a.x, this.y *= a.y, this
		}, Jf.prototype.multiplyScalar = function(S) {
			return this.x *= S, this.y *= S, this
		}, Jf.prototype.divide = function(s) {
			return this.x /= s.x, this.y /= s.y, this
		}, Jf.prototype.divideScalar = function(M) {
			return this.multiplyScalar(1 / M)
		}, Jf.prototype.min = function(q) {
			return this.x = Math.min(this.x, q.x), this.y = Math.min(this.y, q.y), this
		}, Jf.prototype.max = function(c) {
			return this.x = Math.max(this.x, c.x), this.y = Math.max(this.y, c.y), this
		}, Jf.prototype.clamp = function(L, f) {
			return this.x = Math.max(L.x, Math.min(f.x, this.x)), this.y = Math.max(L.y, Math.min(f.y, this.y)), this
		}, Jf.prototype.clampScalar = function() {
			var y, T;
			return function(I, w) {
				return y === S && (y = new Jf, T = new Jf), y.set(I, I), T.set(w, w), this.clamp(y, T)
			}
		}(), Jf.prototype.clampLength = function(y, v) {
			var S = this.length();
			return this.multiplyScalar(Math.max(y, Math.min(v, S)) / S)
		}, Jf.prototype.dot = function(D) {
			return this.x * D.x + this.y * D.y
		}, Jf.prototype.lengthSq = function() {
			return this.x * this.x + this.y * this.y
		}, Jf.prototype.length = function() {
			return Math.sqrt(this.x * this.x + this.y * this.y)
		}, Jf.prototype.normalize = function() {
			return this.divideScalar(this.length())
		}, Jf.prototype.angle = function() {
			var V = Math.atan2(this.y, this.x);
			return 0 > V && (V += 2 * Math.PI), V
		}, Jf.prototype.distanceTo = function(b) {
			return Math.sqrt(this.distanceToSquared(b))
		}, Jf.prototype.distanceToSquared = function(o) {
			var l = this.x - o.x,
				Z = this.y - o.y;
			return l * l + Z * Z
		}, Jf.prototype.isNearEnough = function(k) {
			return this.distanceToSquared(k) < 1e-8
		}, Jf.prototype.setLength = function(V) {
			return this.multiplyScalar(V / this.length())
		}, Jf.prototype.lerp = function(i, O) {
			return this.x += (i.x - this.x) * O, this.y += (i.y - this.y) * O, this
		}, Jf.prototype.lerpVectors = function(m, n, $) {
			return this.subVectors(n, m).multiplyScalar($).add(m)
		}, Jf.prototype.rotateAround = function(J, B) {
			var t = Math.cos(B),
				L = Math.sin(B),
				A = this.x - J.x,
				r = this.y - J.y;
			return this.x = A * t - r * L + J.x, this.y = A * L + r * t + J.y, this
		};
		var Zq = ss.Math.Curve = function() {
			this._curves = []
		};
		Zq.prototype = {}, Zq.prototype.constructor = Zq, Zq.prototype.createFromHtShape = function(r, u, R) {
			u instanceof z.List && (u = u.toArray());
			var v, c, b, k, J, V, D, X = this,
				Q = null,
				m = null,
				_ = 0,
				j = ss.Math.Vector2,
				L = ss.Math.CubicBezier,
				s = function(y) {
					return new j(r[y], r[y + 1], R ? R[y / 2] : S)
				};
			for(c = 0, b = u.length; b > c; c++) {
				switch(k = u[c], J = null, k) {
					case 1:
						m = s(_), Q = m, _ += 2;
						break;
					case 2:
						v = s(_), _ += 2, J = new L(m, m.clone(), v.clone(), v), m = v;
						break;
					case 3:
						V = s(_), v = s(_ + 2), _ += 4, J = new L(m, V.clone().sub(m).multiplyScalar(2 / 3).add(m), V.clone().sub(v).multiplyScalar(2 / 3).add(v), v), m = v;
						break;
					case 4:
						V = s(_), D = s(_ + 2), v = s(_ + 4), _ += 6, J = new L(m, V, D, v), m = v;
						break;
					case 5:
						if(!Q) break;
						J = new L(m, m.clone(), Q.clone(), Q), m = null, Q = null
				}
				J && (J._index = X._curves.length, X._curves.push(J))
			}
		}, Zq.prototype.checkPoint = function(h, I) {
			var j, t, $, G, l, b = this,
				s = b._curves;
			for(j = 0, t = s.length; t > j; j++)
				if(G = s[j], l = G.intersectRect(h, I, I), l.length) return $ = 0, l.forEach(function(S) {
					$ += S.t
				}), $ /= l.length, h = G.getPointAt($), h.t = $, {
					bezier: G,
					intersection: h
				}
		}, Zq.prototype.insertKnot = function(U, L) {
			var x = U.insertKnot(L),
				Z = this,
				W = Z._curves;
			W.splice(U._index, 1, x[0], x[1])
		}, Zq.prototype._isCloseEnough = function(T, C) {
			return Math.abs(T.x - C.x) < 1e-6 && Math.abs(T.y - C.y) < 1e-6
		}, Zq.prototype._isSamePoint = function(M, C) {
			return M === C
		}, Zq.prototype.moveRealPoint = function(o, p) {
			var b = this,
				h = b._curves,
				I = p.clone().sub(o);
			h.forEach(function(T) {
				var q = T._p1;
				T._p2, T._p3;
				var U = T._p4;
				b._isSamePoint(q, o) && (T._p2.add(I), T._p1 = p), b._isSamePoint(U, o) && (T._p3.add(I), T._p4 = p)
			})
		}, Zq.prototype.moveCtrlDueToRealPointMovement = function(k, b) {
			var Z = this,
				G = Z._curves,
				A = function(F) {
					F.add(b), F.e && b.e && (F.e += b.e)
				};
			G.forEach(function(Y) {
				var i = Y._p1;
				Y._p2, Y._p3;
				var F = Y._p4;
				Z._isSamePoint(i, k) && A(Y._p2), Z._isSamePoint(F, k) && A(Y._p3)
			})
		}, Zq.prototype.moveCtrlPoint = function(D, s, z) {
			var l = D[z];
			if(l) {
				l.e !== S && (s.e = l.e);
				var L = this,
					F = L._curves;
				s.clone().sub(l), F.forEach(function(N) {
					var w;
					"c2" === z ? w = "_p2" : "c1" === z && (w = "_p3"), L._isSamePoint(N[w], l) && (N[w] = s)
				}), D[z] = s
			}
		}, Zq.prototype.deleteRealPoint = function(Z, n) {
			var t, $, A, r, q, J, e, x = this,
				y = x._curves,
				U = {},
				v = [],
				O = ss.Math.CubicBezier;
			for($ = 0, A = y.length; A > $; $++) t = y[$], r = t._p1, q = t._p2, J = t._p3, e = t._p4, (U[$] || !x._isSamePoint(r, Z)) && (x._isSamePoint(e, Z) ? A > $ + 1 && x._isSamePoint(y[$ + 1]._p1, Z) && (n || v.push(new O(r, q, y[$ + 1]._p3, y[$ + 1]._p4))) : v.push(t));
			x._curves = v
		}, Zq.prototype.findPairs = function(D, q) {
			var j, B, e, U, h, Z, $, Q, _ = this,
				V = _._curves,
				C = {},
				a = [];
			for(B = 0, e = V.length; e > B; B++) j = V[B], U = j._p1, h = j._p2, Z = j._p3, $ = j._p4, !C[B] && _._isSamePoint(U, D) && (q ? a.push({
				point: U,
				r2: $
			}) : a.push({
				point: U,
				c2: h
			})), _._isSamePoint($, D) && (Q = q ? {
				point: $,
				r1: U
			} : {
				point: $,
				c1: Z
			}, e > B + 1 && _._isSamePoint(V[B + 1]._p1, D) && (q ? Q.r2 = V[B + 1]._p4 : Q.c2 = V[B + 1]._p2, C[B + 1] = !0), a.push(Q));
			return a
		}, Zq.prototype.toHtShape = function() {
			var c = this,
				v = c._curves,
				I = [],
				t = [],
				V = {
					x: 1 / 0,
					y: 1 / 0
				};
			return v.forEach(function(D) {
				var u = D._p1,
					B = D._p2,
					x = D._p3,
					Q = D._p4;
				return c._isCloseEnough(u, V) || (I.push(1), t.push(u.clone())), V = Q, c._isCloseEnough(u, B) && c._isCloseEnough(x, Q) ? (I.push(2), t.push(Q.clone()), void 0) : (I.push(4), t.push(B.clone(), x.clone(), Q.clone()), void 0)
			}), {
				segments: I,
				points: t
			}
		};
		var Mp = ss.Math.CubicBezier = function(N, A, r, H) {
			var k = this;
			k._id = ss.Math.CubicBezier._globalId++, k._p1 = N, k._p2 = A, k._p3 = r, k._p4 = H
		};
		Mp._globalId = 1, Mp.prototype = {}, Mp.prototype.constructor = Mp, Mp.prototype.toString = function() {
			return this._id
		}, Mp.prototype.intersectRect = function(N, o, L) {
			var n = o / 2,
				C = L / 2,
				p = N.x,
				x = N.y,
				g = ss.Math.Vector2,
				G = new g(-n + p, -C + x),
				Y = new g(n + p, C + x),
				s = new g(Y.x, G.y),
				w = new g(G.x, Y.y),
				X = this,
				c = X.intersectLine(G, s),
				e = X.intersectLine(s, Y),
				I = X.intersectLine(Y, w),
				P = X.intersectLine(w, G),
				i = c.concat(e).concat(I).concat(P);
			return i
		}, Mp.prototype.intersectLine = function(b, j) {
			var D, C, v, W, n, g, p, Q, x, E, i, L, e, a = this,
				M = b.clone().min(j),
				T = b.clone().max(j);
			W = a._p1, n = a._p2, g = a._p3, p = a._p4, D = W.clone().multiplyScalar(-1), C = n.clone().multiplyScalar(3), v = g.clone().multiplyScalar(-3), i = D.add(C).add(v).add(p), D = W.clone().multiplyScalar(3), C = n.clone().multiplyScalar(-6), v = g.clone().multiplyScalar(3), E = D.add(C).add(v), D = W.clone().multiplyScalar(-3), C = n.clone().multiplyScalar(3), x = D.add(C), Q = W.clone(), e = new ss.Math.Vector2(b.y - j.y, j.x - b.x), L = b.x * j.y - j.x * b.y;
			for(var P = a.getRoots(e.dot(i), e.dot(E), e.dot(x), e.dot(Q) + L), q = new Array, d = 0, f = P.length; f > d; d++) {
				var N = P[d];
				if(!(0 > N || N > 1)) {
					var A = W.clone().lerp(n, N),
						y = n.clone().lerp(g, N),
						u = g.clone().lerp(p, N),
						H = A.lerp(y, N),
						z = y.lerp(u, N),
						_ = H.lerp(z, N);
					_.t = N, b.x == j.x ? M.y <= _.y && _.y <= T.y && q.push(_) : b.y == j.y ? M.x <= _.x && _.x <= T.x && q.push(_) : _.x >= M.x && _.y >= M.y && _.x <= T.x && _.y <= T.y && q.push(_)
				}
			}
			return q
		}, Mp.prototype.solveTForPoint = function(w) {
			var q, u, N, M, b = this;
			q = b._p1.x - w.x, u = b._p2.x - w.x, N = b._p3.x - w.x, M = b._p4.x - w.x;
			for(var T = b.getRoots(M - 3 * N + 3 * u - q, 3 * N - 6 * u + 3 * q, 3 * u - 3 * q, q), c = S, H = 1 / 0, O = 0, I = T.length; I > O; O++) {
				var D = T[O];
				if(!(0 > D || D > 1)) {
					var Z = b._p1.clone().lerp(b._p2, D),
						z = b._p2.clone().lerp(b._p3, D),
						y = b._p3.clone().lerp(b._p4, D),
						$ = Z.lerp(z, D),
						K = z.lerp(y, D),
						W = $.lerp(K, D);
					W.t = D;
					var L = Math.abs(W.y - w.y);
					H > L && (H = L, c = W)
				}
			}
			return c
		}, Mp.prototype.getPointAt = function(Q) {
			var U = this,
				h = U._p1,
				u = U._p2,
				O = U._p3,
				S = U._p4,
				o = h.clone().lerp(u, Q),
				r = u.clone().lerp(O, Q),
				Y = O.clone().lerp(S, Q),
				K = o.lerp(r, Q),
				D = r.lerp(Y, Q);
			return K.lerp(D, Q)
		}, Mp.prototype.getRoots = function(A, f, b, r) {
			var I, q, k, e, c, X = new Array;
			if(Math.abs(A) < 1e-6) {
				var I = f,
					q = b / I,
					k = r / I,
					e = q * q - 4 * k;
				if(e > 0) {
					var c = Math.sqrt(e);
					X.push(.5 * (-q + c)), X.push(.5 * (-q - c))
				} else 0 == e && X.push(.5 * -q)
			}
			f /= A, b /= A, r /= A, I = (3 * b - f * f) / 3, q = (2 * f * f * f - 9 * b * f + 27 * r) / 27;
			var K = f / 3,
				S = q * q / 4 + I * I * I / 27,
				P = q / 2;
			if(Math.abs(S) <= 1e-6 && (S = 0), S > 0) {
				var M, u, c = Math.sqrt(S);
				M = -P + c, u = M >= 0 ? Math.pow(M, 1 / 3) : -Math.pow(-M, 1 / 3), M = -P - c, M >= 0 ? u += Math.pow(M, 1 / 3) : u -= Math.pow(-M, 1 / 3), X.push(u - K)
			} else if(0 > S) {
				var R = Math.sqrt(-I / 3),
					O = Math.atan2(Math.sqrt(-S), -P) / 3,
					Z = Math.cos(O),
					p = Math.sin(O),
					W = Math.sqrt(3);
				X.push(2 * R * Z - K), X.push(-R * (Z + W * p) - K), X.push(-R * (Z - W * p) - K)
			} else {
				var M;
				M = P >= 0 ? -Math.pow(P, 1 / 3) : Math.pow(-P, 1 / 3), X.push(2 * M - K), X.push(-M - K)
			}
			return X
		}, Mp.prototype._70I = function() {
			var Y = this;
			return Y._p1.distanceToSquared(Y._p2) < 1e-10 && Y._p3.distanceToSquared(Y._p4) < 1e-10
		}, Mp.prototype.insertKnot = function(H) {
			var w = this,
				y = w._p1,
				g = w._p2,
				d = w._p3,
				Z = w._p4,
				o = y.clone().lerp(g, H),
				r = g.clone().lerp(d, H),
				Y = d.clone().lerp(Z, H),
				e = o.clone().lerp(r, H),
				j = r.clone().lerp(Y, H),
				R = e.clone().lerp(j, H);
			return w._70I() ? (y.clone().lerp(Z, H), [new ss.Math.CubicBezier(y, y.clone(), R.clone(), R), new ss.Math.CubicBezier(R, R.clone(), Z.clone(), Z)]) : [new ss.Math.CubicBezier(y, o, e, R), new ss.Math.CubicBezier(R, j, Y, Z)]
		};
		var yf = z.Default.getInternal().ui().EdgeUI,
			Jg = {
				_47O: function(R) {
					var F = this,
						U = Jg.getBackups()._47O;
					ss.inEdit(F.gv) || U.call(F, R)
				}
			};
		ss.Inject.registAsModule(Jg, yf);
		var kc = z.Default.getInternal().ui().NodeUI,
			_o = {
				_47O: function(Y) {
					var F = this,
						x = _o.getBackups()._47O;
					ss.inEdit(F.gv) || x.call(F, Y)
				},
				getSelectWidth: function() {
					var V = this,
						G = V.gv,
						L = V._data;
					if(G.isEditable(L) && ss.inEdit(G)) return 0;
					var p = _o.getBackup("getSelectWidth");
					return p.call(V)
				}
			};
		ss.Inject.registAsModule(_o, kc);
		var Mq = z.graph.GraphView,
			fi = {
				_editPointSize: function() {
					var t = z.Default.isTouchable,
						Z = ss.getStyle("pointSize");
					return Z[t ? 0 : 1]
				}(),
				isPointEditable: function(y) {
					var U = this;
					if(ss.inEdit(U)) return U._pointEditableFunc ? U._pointEditableFunc(y) : !0;
					var f = fi.getBackup("isPointEditable");
					f.call(U, y)
				},
				isEditable: function(a) {
					var V, B = this,
						J = fi.getBackup("isEditable");
					if(V = a instanceof ss.Group ? !0 : J.call(B, a), !ss.inEdit(B)) return V;
					if(!(a instanceof z.Edge)) return V;
					if(!a.s("2d.editable")) return !1;
					var x = B.getEditableFunc();
					return x ? x(a) : !0
				},
				_42: function(A, f) {
					var l = this,
						t = fi.getBackups()._42;
					if(t.call(l, A, f), ss.inEdit(l)) {
						var x = l.getEditInteractor();
						x.drawImpl()
					}
				}
			};
		ss.Inject.registAsModule(fi, Mq);
		var Of = z.Default.getInternal().ui().ShapeUI,
			wr = {
				_47O: function(g) {
					var y = this,
						T = wr.getBackups()._47O;
					ss.inEdit(y.gv) || T.call(y, g)
				}
			};
		ss.Inject.registAsModule(wr, Of);
		var El = z.graph.DefaultInteractor,
			vh = {
				handle_mousewheel: function(P) {
					var M = this,
						B = vh.getBackup("handle_mousewheel");
					ss.inEdit(M.gv) || B.call(M, P)
				}
			};
		ss.Inject.registAsModule(vh, El);
		var Qj = z.graph.MoveInteractor,
			_h = {
				_calcShift: function(w, E) {
					var T = this,
						s = _h.getBackup("_calcShift"),
						k = T.gv;
					if(!ss.inEdit(k)) return s.call(T, w, E);
					var K = k.getEditInteractor(),
						M = K.getSubModule("Move").calcShift(w, E, T);
					return M || s.call(T, w, E)
				},
				clear: function(b) {
					var s = this,
						G = _h.getBackup("clear");
					G.call(s, b);
					var v = s.gv;
					if(ss.inEdit(v)) {
						var Y = v.getEditInteractor();
						Y.getSubModule("Move").clear(b)
					}
				}
			};
		ss.Inject.registAsModule(_h, Qj);
		var Am = ss.Rect = function(_) {
			this.catalog = "Rect", this._interactor = _
		};
		Am.prototype = {}, Am.prototype.constructor = Am, Am.prototype.gatherInfo = function(t, o) {
			var l = this;
			if(1 === o.length) {
				var H = o[0];
				return H instanceof z.Shape && H._70I() ? l.gatherLine(t, H) : Ef(H, t) ? !1 : l.gatherSingleTarget(t, H)
			}
			return o.length > 1 ? l.gatherMultiTargets(t, o) : !1
		}, Am.prototype.gatherSingleTarget = function(T, n) {
			if(n.getCorners) {
				var E, v = this,
					w = v.info;
				v.target = n, E = v.screenInfo = {};
				var M = n.getCorners();
				w.LT = new ss.Math.Vector2(M[0]), w.LB = new ss.Math.Vector2(M[1]), w.RB = new ss.Math.Vector2(M[2]), w.RT = new ss.Math.Vector2(M[3]), w.T = w.LT.clone().add(w.RT).divideScalar(2), w.B = w.LB.clone().add(w.RB).divideScalar(2), w.L = w.LT.clone().add(w.LB).divideScalar(2), w.R = w.RT.clone().add(w.RB).divideScalar(2);
				for(var V in w) E[V] = ss.toScreenPosition(T, w[V]);
				var f = v._interactor,
					o = f.getStyle("checkSize"),
					A = function(X, H, t) {
						var B = H.clone().sub(X).setLength(-o),
							f = t.clone().sub(X).setLength(-o),
							K = B.add(f).add(X);
						return K
					};
				return E.rotLT = A(E.LT, E.RT, E.LB), E.rotLB = A(E.LB, E.LT, E.RB), E.rotRB = A(E.RB, E.LB, E.RT), E.rotRT = A(E.RT, E.LT, E.RB), E.rotT = E.rotLT.clone().add(E.rotRT).divideScalar(2), E.rotB = E.rotLB.clone().add(E.rotRB).divideScalar(2), E.rotL = E.rotLT.clone().add(E.rotLB).divideScalar(2), E.rotR = E.rotRT.clone().add(E.rotRB).divideScalar(2), E.rotation = n.getRotation(), v.gatherConnectInfo(), !0
			}
		}, Am.prototype.gatherConnectInfo = function() {
			var L = this,
				h = L.target,
				K = L._interactor,
				I = L.screenInfo,
				u = K.gv;
			if(h instanceof z.Node && K.getStyle("connectGuideVisible")) {
				var V = h.s("connectGuideShift") || K.getStyle("connectGuideShift"),
					n = h.getAnchor(),
					w = h.getSize(),
					t = h.toGlobal({
						x: w.width * (V[0] - n.x),
						y: w.height * (V[1] - n.y)
					});
				t = ss.toScreenPosition(u, t), I.P1 ? t.add(I.P2.clone().sub(I.P1).setLength(V[2])) : (t.add(I.RT.clone().sub(I.LT).setLength(V[2])), t.add(I.LB.clone().sub(I.LT).setLength(V[3]))), I.connect = t
			}
		}, Am.prototype.gatherMultiTargets = function(Q, D) {
			var T = ss.Group.findOrCreateGroup(D);
			if(!T) return !1;
			var j = this;
			return j.editing && "rotate" !== j.editing.mode || T.calcInfo(), j.gatherSingleTarget(Q, T)
		}, Am.prototype.gatherLine = function(F, f) {
			this.target = f;
			var q = this.screenInfo = {},
				U = f.getPoints(),
				u = ss.getDataMatrix(f);
			return q.P1 = ss.toScreenPosition(F, u.apply(U.get(0))), q.P2 = ss.toScreenPosition(F, u.apply(U.get(1))), this.gatherConnectInfo(), !0
		}, Am.ResizeKeys = ["LT", "RB", "LB", "RT", "L", "R", "B", "T"], Am.ResizeDirection = [{
			x: -1,
			y: -1
		}, {
			x: 1,
			y: 1
		}, {
			x: -1,
			y: 1
		}, {
			x: 1,
			y: -1
		}, {
			x: -1,
			y: 0
		}, {
			x: 1,
			y: 0
		}, {
			x: 0,
			y: 1
		}, {
			x: 0,
			y: -1
		}], Am.RotateKeys = ["rotLT", "rotRB", "rotLB", "rotRT", "rotL", "rotR", "rotB", "rotT"], Am.prototype.check = function(L, O, T) {
			if(z.Default.isLeftButton(O)) {
				var q = this;
				if(q.editing = null, q.tipInfo = null, q.screenInfo) {
					var h = q.target,
						n = L.isEditable(h),
						o = q.screenInfo;
					if(n && o.connect) {
						var Z = q._checkConnect(T);
						if(Z) return Z
					}
					if(o.P1) return q._checkLine(T);
					var R, r, m, G = null,
						M = q._interactor,
						l = M.getStyle("checkSize");
					if(n && L.isRectEditable(h))
						for(r = 0; r < ss.Rect.ResizeKeys.length; r++)
							if(m = ss.Rect.ResizeKeys[r], ss.checkHit(T, o[m], l)) {
								G = m, R = "resize";
								break
							}
					if(!G && n && L.isRotationEditable(h)) {
						var j = M.getStyle("rotateCheckSize");
						for(r = 0; r < ss.Rect.RotateKeys.length; r++)
							if(m = ss.Rect.RotateKeys[r], ss.checkHit(T, o[m], j)) {
								G = m, R = "rotate";
								break
							}
					}
					if(!G) return M.setCursor("default"), void 0;
					if("rotate" === R) {
						var x, N = L.lp(O);
						if(h instanceof ss.Group) {
							var c = M.getStyle("groupRotateModeKey");
							"string" == typeof c && (c = [c]);
							for(var i = !1, Y = 0, Q = c.length; Q > Y; Y++)
								if(O[c[Y]]) {
									i = !0;
									break
								}
							var I = M.getStyle("groupRotateModeDefault");
							x = i ? "batch" === I ? "block" : "batch" : I
						}
						var J = "batch" === x ? h.getAnchor2() : h.getPosition(),
							e = Math.atan2(N.y - J.y, N.x - J.x);
						M._setRotateCursor(e), q.editing = {
							mode: R,
							key: G,
							pos: J,
							flipY: h.getScale().y < 0,
							rotation: h.getRotation(),
							hitRot: e
						}, x && (q.editing.groupRotateMode = x)
					} else {
						var k = ss.Rect.ResizeKeys.indexOf(G),
							$ = ss.Rect.ResizeDirection[k],
							_ = Math.cos(h.getRotation()),
							W = Math.sin(h.getRotation()),
							u = $.x * Math.sign(h.getScale().x),
							X = $.y * Math.sign(h.getScale().y),
							s = Math.atan2(-W * u - _ * X, _ * u - W * X),
							f = (Math.round(s / (Math.PI / 4)) + 8) % 8,
							C = ["ew-resize", "nesw-resize", "ns-resize", "nwse-resize", "ew-resize", "nesw-resize", "ns-resize", "nwse-resize"][f];
						this._interactor.setCursor(C);
						var v = h.getWidth(),
							S = h.getHeight(),
							d = h.getAnchor();
						q.editing = {
							mode: R,
							key: G,
							rect: {
								x: -v * d.x,
								y: -S * d.y,
								width: v,
								height: S
							},
							anchor: d,
							matrix: h.getMatrix()
						}
					}
					return G
				}
			}
		}, Am.prototype._checkLine = function(X) {
			var h = this;
			h.screenInfo;
			var u, y = h._interactor.getStyle("checkSize");
			if(ss.checkHit(X, h.screenInfo.P1, y)) u = "P1";
			else {
				if(!ss.checkHit(X, h.screenInfo.P2, y)) return this._interactor.setCursor("default"), void 0;
				u = "P2"
			}
			return h.editing = {
				mode: "line",
				key: u
			}, u
		}, Am.prototype._checkConnect = function(T) {
			var H = this,
				k = H.screenInfo,
				r = H._interactor,
				v = r.getStyle("connectGuideIntersectSize");
			if(ss.checkHit(T, k.connect, v)) {
				var p = "connect",
					f = h.getConnectAction();
				return H.editing = {
					mode: p
				}, f && f.delete && f.delete.visible.call(null, H.target) && (H.editing.hasDeleteAction = !0), r.setCursor("default"), p
			}
		}, Am.prototype._fireEditEvent = function(e, v) {
			var Q = this._interactor,
				a = this.editing;
			if(a) {
				var V = a.mode;
				V = "rotate" === V ? "Rotation" : "connect" === V ? "Connection" : V[0].toUpperCase() + V.slice(1), Q.fi({
					kind: e + "Edit" + V,
					event: v
				})
			}
		}, Am.prototype.startEdit = function(j, x) {
			j.startDragging(x);
			var H = this;
			H._interactor.fi({
				kind: "prepareEdit",
				event: x
			});
			var Y = H.editing,
				S = H.target;
			if(Y) {
				if(H._fireEditEvent("begin", x), "rotate" === Y.mode) return Y.groupRotateMode && S.beginRotate(Y), void 0;
				if("connect" !== Y.mode)("line" === Y.mode || S && 0 === S.getRotation()) && (H._inSmartGuide = !0, H._interactor.rectGuide.gatherRects());
				else if(Y.hasDeleteAction) {
					var X = j.gv,
						O = H._interactor.getStyle("connectGuideGarbageShift");
					Y.garbageInfo = {
						x: X.getWidth() * O[0] + O[2],
						y: X.getHeight() * O[1] + O[3],
						size: H._interactor.getStyle("connectGuideGarbageIntersectsize")
					}, j._42()
				}
			}
		}, Am.prototype._46O = function(m) {
			var X, L = this,
				J = L.editing;
			if(J) {
				if("connect" === J.mode && !J.canceled && !J.deleted) try {
					J.garbageInfo && J.garbageInfo.hover ? h.doDeleteConnectionAction(L.target) : h.doConnectAction(L.target, J.target)
				} catch(m) {}
				X = L.editing.groupRotateMode, L._fireEditEvent("end", m), L.editing = null
			}
			L.tipInfo = null, L._inSmartGuide && (L._interactor.rectGuide.clear(), L._inSmartGuide = !1), X && L.target && L.target.endRotate()
		}, Am.prototype.handleNormalStateDelete = function() {
			var W = this,
				y = W.editing;
			if(y && "connect" === y.mode && !y.canceled && !y.deleted) {
				if(y.garbageInfo) {
					try {
						h.doDeleteConnectionAction(W.target)
					} catch(X) {}
					y.garbageInfo = null
				}
				return y.cursorPos = null, y.targetCorners = null, y.deleted = !0, W._interactor._42(), !0
			}
		}, Am.prototype.handleNormalStateKeyDown = function(r) {
			var m = this,
				g = m.editing;
			return !g || "connect" !== g.mode || g.canceled || g.deleted ? void 0 : z.Default.isEsc(r) ? (g.cursorPos = null, g.targetCorners = null, g.canceled = !0, m._interactor._42(), !0) : void 0
		}, Am.prototype.handleEdit = function(H, r) {
			var w = this,
				$ = w.editing;
			if($) {
				var R, K, P, y, m, Z = w.target,
					X = $.key,
					v = $.mode,
					A = H.lp(r),
					S = w._interactor;
				if("connect" === v) {
					if($.canceled) return;
					if($.deleted) return;
					$.cursorPos = S._getLogicalPoint(r);
					var V = $.garbageInfo;
					return V && ss.checkHit($.cursorPos, V, V.size) ? (V.hover = !0, $.target = null, $.targetCorners = null) : (V && (V.hover = !1), $.target = H.getDataAt(A, function(m) {
						return H.isSelectable(m) ? mm(m) ? !0 : !1 : !1
					}) || null, $.targetCorners = ss.getTargetCornersOnScreen(H, $.target)), S._42(), void 0
				}
				if("rotate" === v) {
					var b, W, o = $.pos,
						F = Math.atan2(A.y - o.y, A.x - o.x);
					if($.groupRotateMode ? W = F - $.hitRot : (b = F - $.hitRot, W = $.rotation + b), W %= 2 * Math.PI, 0 > W && (W += 2 * Math.PI), !z.Default.isCtrlDown(r)) {
						var u, l;
						Tm(r) ? (u = S.getStyle("shiftRotateRound"), l = u / 2) : (u = S.getStyle("rotateRound"), l = S.getStyle("rotateSensitivity")), W = ss.roundTo(W, u, l)
					}
					$.groupRotateMode ? (b = W - ($.lastRotation || 0), 0 !== b && (Z.addRotation(b, $.groupRotateMode), $.lastRotation = W)) : Z.setRotation(W), S._setRotateCursor(F), W > Math.PI && (W -= 2 * Math.PI);
					var M = 180 * (W / Math.PI);
					M = M.toFixed(2), R = "" + M + "Â°"
				} else if("resize" === v) {
					var c = $.rect;
					P = c.x, y = c.y;
					var Q, j = c.width,
						g = c.height,
						q = $.anchor,
						Y = $.matrix,
						e = Tm(r),
						G = w._unionPointMode1,
						f = w._unionPointMode2;
					if(w._inSmartGuide && !z.Default.isCtrlDown(r) && !e) {
						var T;
						"L" === X || "R" === X ? T = "x" : ("T" === X || "B" === X) && (T = "y"), w._adsorbedToClosest(A, T), m = !0
					}
					Q = Y.tfi(A);
					var i;
					"LT" === X ? (c = G(Q, {
						x: P + j,
						y: y + g
					}, j, g, e), i = 9) : "T" === X ? (c = f({
						x: P,
						y: Q.y
					}, {
						x: P + j,
						y: y + g
					}, j, g, e, "v"), i = 1) : "RT" === X ? (c = G(Q, {
						x: P,
						y: y + g
					}, j, g, e), i = 33) : "L" === X ? (c = f({
						x: Q.x,
						y: y
					}, {
						x: P + j,
						y: y + g
					}, j, g, e, "h"), i = 8) : "R" === X ? (c = f({
						x: P,
						y: y
					}, {
						x: Q.x,
						y: y + g
					}, j, g, e, "h"), i = 32) : "LB" === X ? (c = G(Q, {
						x: P + j,
						y: y
					}, j, g, e), i = 12) : "B" === X ? (c = f({
						x: P,
						y: y
					}, {
						x: P + j,
						y: Q.y
					}, j, g, e, "v"), i = 4) : "RB" === X && (c = G(Q, {
						x: P,
						y: y
					}, j, g, e), i = 36);
					var B = Y.tf(c.x + c.width * q.x, c.y + c.height * q.y);
					Z.setPosition(B), Z.setSize(c.width, c.height), m && (K = Z.getRect(), S.rectGuide.gatherLines({
						node: Z,
						x: K.x,
						y: K.y,
						w: K.width,
						h: K.height
					}, T, i)), R = "" + Math.round(c.width) + " * " + Math.round(c.height)
				} else if("line" === v) {
					if(Tm(r)) {
						var t = Z.getPoints(),
							D = "P1" === X ? t.get(1) : t.get(0),
							k = {
								x: A.x - D.x,
								y: A.y - D.y
							},
							I = S.getStyle("shiftLineRotateRound"),
							d = w._shiftDirList;
						if(!d || w._shiftRotateRound !== I) {
							w._shiftRotateRound = I, w._shiftDirList = d = [];
							for(var E = 0; E < Math.PI; E += I) d.push({
								x: L(E),
								y: s(E)
							})
						}
						for(var x, N = 0, J = 0, p = d.length; p > J; J++) {
							var O = d[J],
								h = O.x * k.x + O.y * k.y;
							Math.abs(h) > Math.abs(N) && (N = h, x = O)
						}
						A = {
							x: D.x + x.x * N,
							y: D.y + x.y * N
						}, S.rectGuide.clear()
					} else w._inSmartGuide && !z.Default.isCtrlDown(r) && (w._adsorbedToClosest(A), m = !0);
					var U = ss.getDataMatrix(Z).applyInverse(A);
					Z.setPoint("P1" === X ? 0 : 1, U, !0);
					var a = Z.getPoints(),
						C = a.get(0),
						_ = a.get(1);
					P = C.x - _.x, y = C.y - _.y, R = " " + Math.round(Math.sqrt(P * P + y * y)) + " ", m && (K = Z.getRect(), S.rectGuide.gatherLines({
						node: Z,
						x: K.x,
						y: K.y,
						w: K.width,
						h: K.height
					}))
				}
				if(R) {
					var n = z.Default.getLogicalPoint(r, S._canvas);
					n.x += ss.Icons.TipShiftX, n.y += ss.Icons.TipShiftY, w.tipInfo = {
						helperPos: n,
						text: R,
						size: R.length
					}
				}
				w._fireEditEvent("between", r)
			}
		}, Am.prototype._unionPointMode1 = function(Q, f, G, K, M) {
			if(M && G && K) {
				var m = Q.x - f.x,
					q = Q.y - f.y;
				Math.abs(m * K) < Math.abs(q * G) ? (q = Math.sign(q) * Math.abs(m * K / G), Q.y = f.y + q) : (m = Math.sign(m) * Math.abs(q * G / K), Q.x = f.x + m)
			}
			return z.Default.unionPoint(Q, f)
		}, Am.prototype._unionPointMode2 = function(Y, m, x, R, n, p) {
			var S = z.Default.unionPoint(Y, m);
			if(n && x && R) {
				var F;
				"v" === p ? (F = S.x + S.width / 2, S.width = x * S.height / R, S.x = F - S.width / 2) : (F = S.y + S.height / 2, S.height = R * S.width / x, S.y = F - S.height / 2)
			}
			return S
		}, Am.prototype._adsorbedToClosest = function(A, L) {
			var c = this,
				Z = c._interactor,
				M = Z.rectGuide.findClosest(A, L),
				t = Z.gridGuide.findClosest(A, L),
				X = 1 / 0,
				R = 1 / 0;
			M && (isFinite(M.x) && (X = M.x), isFinite(M.y) && (R = M.y)), t && (isFinite(t.x) && Math.abs(t.x) < Math.abs(X) && (X = t.x), isFinite(t.y) && Math.abs(t.y) < Math.abs(R) && (R = t.y)), isFinite(X) && (A.x += X), isFinite(R) && (A.y += R)
		}, Am.prototype._42 = function($, J, Q) {
			var Y = this;
			Y.info = {}, Y.screenInfo = null;
			var F = Y._interactor;
			if(!F.editDetail && Y.gatherInfo(J, Q)) {
				var Z = Y.editing,
					N = Z ? Z.groupRotateMode : null,
					K = Y.screenInfo;
				"block" !== N && (K.P1 ? ss.Icons.DrawIcon(F, $, ss.Icons.Line, K) : ss.Icons.DrawIcon(F, $, ss.Icons.Rect, K), K.connect && (ss.Icons.DrawIcon(F, $, ss.Icons.ConnectGuide, {
					rotation: K.rotation,
					connect: K.connect,
					cursorPos: Z ? Z.cursorPos : null
				}), Z && (Z.targetCorners && ss.Icons.DrawIcon(F, $, ss.Icons.NodeHoverGuide, Z.targetCorners), Z.garbageInfo && ss.Icons.DrawIcon(F, $, ss.Icons.ConnectGuideGarbage, Z.garbageInfo))), Y.tipInfo && ss.Icons.DrawIcon(F, $, ss.Icons.TipHelper, Y.tipInfo)), Y.target instanceof ss.Group && Y.target._42(F, $, J)
			}
		};
		var ib = ss.Anchor = function(n) {
			this.catalog = "Anchor", this._interactor = n
		};
		ib.prototype = {}, ib.prototype.constructor = ib, ib.prototype.gatherInfo = function(P, B) {
			var O = this;
			if(1 === B.length) {
				var A = B[0];
				if(!A.getAnchor) return;
				if(A instanceof z.Shape && A._70I()) return;
				if(Ef(A, P)) return;
				return O.gatherSingleTarget(P, B[0])
			}
			return B.length > 1 ? O.gatherMultiTargets(P, B) : !1
		}, ib.prototype.gatherSingleTarget = function(O, F) {
			var I = this;
			return I.info.POS = F.getPosition(), I.screenInfo.POS = ss.toScreenPosition(O, I.info.POS), I.target = F, !0
		}, ib.prototype.gatherMultiTargets = function(N, y) {
			var U = this,
				p = ss.Group.findOrCreateGroup(y);
			return p ? (U.screenInfo.POS = ss.toScreenPosition(N, p.getAnchor2()), U.target = p, !0) : !1
		}, ib.prototype.isVisible = function() {
			var y = this,
				T = y._interactor;
			if(T.getStyle("anchorVisible") === !1) return !1;
			var X = y.target;
			if(X) {
				if(this.editing) return !0;
				var x = X.getAnchor(),
					L = T.getStyle("anchorOutsideVisibleThreshold");
				if(x.x < -L || x.x > 1 + L || x.y < -L || x.y > 1 + L) return !0;
				var V = X.getSize(),
					E = X.getScale(),
					k = Math.min(Math.abs(V.width * E.x), Math.abs(V.height * E.y));
				if(k * T.gv._zoom < T.getStyle("anchorHideThreshold")) return !1
			}
			return !0
		}, ib.prototype.check = function(t, l, v) {
			if(z.Default.isLeftButton(l)) {
				var B = this,
					X = B._interactor;
				if(B.isVisible() && X.getStyle("anchorMovable") !== !1) {
					B.editing = null, B.tipInfo = null;
					var U = B.target;
					if(U && t.isAnchorEditable(U) && t.isEditable(U)) {
						var E;
						if(B.screenInfo && (E = B.screenInfo.POS) && ss.checkHit(v, new ss.Math.Vector2(E), X.getStyle("checkSize"))) {
							if(U instanceof ss.Group) return B.editing = {}, !0;
							var x = U.getWidth(),
								s = U.getHeight(),
								D = U.getAnchor();
							return B.editing = {
								rect: {
									x: -x * D.x,
									y: -s * D.y,
									width: x,
									height: s
								},
								anchor: D,
								matrix: U.getMatrix()
							}, !0
						}
					}
				}
			}
		}, ib.prototype.startEdit = function(q, W) {
			q.startDragging(W), q.fi({
				kind: "beginEditAnchor",
				event: W
			})
		}, ib.prototype._46O = function(l) {
			var S = this;
			S.editing && (S.editing = null, S._interactor.fi({
				kind: "endEditAnchor",
				event: l
			})), S.tipInfo = null
		}, ib.prototype.handleEdit = function(L, R) {
			var X = this,
				G = X.target;
			if(G) {
				var M = X.editing;
				if(M) {
					var $ = L.lp(R),
						c = X._interactor;
					if(G instanceof ss.Group) return G.setAnchor2($), c._42(), void 0;
					var Z = M.matrix,
						V = Z.tfi($),
						u = M.rect,
						s = (V.x - u.x) / u.width,
						h = (V.y - u.y) / u.height;
					if(!z.Default.isCtrlDown(R)) {
						var C = c.getStyle("anchorRound"),
							g = c.getStyle("anchorSensitivity");
						s = ss.roundTo(s, C, g), h = ss.roundTo(h, C, g)
					}
					G.setAnchor(s, h, !0);
					var p = z.Default.getLogicalPoint(R, c._canvas);
					p.x += ss.Icons.TipShiftX, p.y += ss.Icons.TipShiftY;
					var F = "" + s.toFixed(2) + ", " + h.toFixed(2);
					X.tipInfo = {
						helperPos: p,
						text: F,
						size: F.length
					}, c.fi({
						kind: "betweenEditAnchor",
						event: R
					})
				}
			}
		}, ib.prototype._42 = function(x, A, d) {
			var F = this;
			F.info = {}, F.screenInfo = {};
			var Z = F._interactor;
			Z.editDetail || F.gatherInfo(A, d) && F.isVisible() && (ss.Icons.DrawIcon(Z, x, ss.Icons.Anchor, F.screenInfo), F.tipInfo && ss.Icons.DrawIcon(Z, x, ss.Icons.TipHelper, F.tipInfo))
		};
		var Zq = ss.Curve = function(h) {
			this.catalog = "Curve", this._interactor = h
		};
		Zq.prototype = {}, Zq.prototype.constructor = Zq, f.defineProperties(Zq.prototype, {
			activing: {
				get: function() {
					return this._activing
				},
				set: function(X) {
					var h = this;
					if(X) h._activing = new ss.CurveActiving(this, X);
					else {
						var $ = h._activing;
						$ && $.dispose(), h._activing = null
					}
				}
			}
		}), Zq.PointType = {
			Mirrored: 0,
			Straight: 1,
			Disconnected: 2,
			Asymmetric: 3
		}, Zq.prototype.setUp = function() {
			var H = this,
				I = H._interactor;
			I && I.gv.mp(H._onGraphviewPropertyChanged, H)
		}, Zq.prototype._onGraphviewPropertyChanged = function(L) {
			("zoom" === L.property || "translateX" === L.property || "translateY" === L.property) && this._handleDataChanged()
		}, Zq.prototype.tearDown = function() {
			var F = this,
				D = F._interactor;
			D && D.gv.ump(F._onGraphviewPropertyChanged, F)
		}, Zq.prototype.canEnterEditDetailMode = function() {
			var I = this,
				t = I._interactor,
				w = t._getValidSelection();
			if(1 === w.length) {
				var N = w[0],
					s = N instanceof z.Edge;
				if(N instanceof z.Shape || s) {
					if(s) {
						var S = N.s("edge.type");
						if(S && "points" !== S) return
					}
					var F = t.gv;
					if(F.isPointEditable(N) && F.isEditable(N)) return I.target = N, !0
				}
			}
		}, Zq.prototype.preHandleScroll = function() {
			var z = this.editing;
			return z && z.inEdit ? !0 : void 0
		}, Zq.prototype.getCurrentSelectintStatus = function() {
			var D = this;
			if(D.activing && !D.activing.selections) {
				if(D.activing.status != S) return D.activing.status;
				var h = function(T) {
						var l = D.activing.status;
						D.activing.status = T, D._interactor.fp("shapePointStatus", l, T)
					},
					z = ss.Curve.PointType,
					j = D.activing.point,
					c = D.activing.pairs;
				if(!c || 1 !== c.length) return h(z.Mirrored);
				var I = c[0],
					t = I.c1 && I.c1.isNearEnough(j),
					O = I.c2 && I.c2.isNearEnough(j);
				if(!I.c1 || !I.c2) return t || O ? h(z.Straight) : h(z.Disconnected);
				if(t && O) return h(z.Straight);
				if(t || O) return h(z.Asymmetric);
				var y = I.c1.clone().sub(j),
					G = I.c2.clone().sub(j);
				return Math.abs(y.x * G.y - y.y * G.x) > 1e-5 || y.x * G.x > 0 ? h(z.Disconnected) : Math.abs(y.length() - G.length()) > 1e-5 ? h(z.Asymmetric) : h(z.Mirrored)
			}
		}, Zq.prototype.handle_keydown = function(q) {
			var r = this;
			if(r._interactor.editDetail) {
				var H = ss.Curve.PointType;
				"1" === q.key ? r.setCurrentSelectionStatus(H.Straight) : "2" === q.key ? r.setCurrentSelectionStatus(H.Mirrored) : "3" === q.key ? r.setCurrentSelectionStatus(H.Disconnected) : "4" === q.key && r.setCurrentSelectionStatus(H.Asymmetric)
			}
		}, Zq.prototype.setCurrentSelectionStatus = function(q) {
			var m = this,
				U = m.activing;
			if(U) {
				var z = m.getCurrentSelectintStatus();
				if(null !== z && z !== q) {
					U.status = q;
					var C = m.activing.point,
						B = m.activing.pairs;
					if(B && 1 === B.length) {
						var u = B[0],
							e = m.screenInfo.curve,
							H = ss.Curve.PointType,
							P = function() {
								m._writeToHt(), m._interactor.fp("shapePointStatus", z, q)
							};
						if(q === H.Straight) return e.moveCtrlPoint(u, C, "c1"), e.moveCtrlPoint(u, C, "c2"), P(), void 0;
						if(z === H.Straight) {
							var v = e.findPairs(C, !0),
								I = v[0],
								j = I.r1 || C,
								R = I.r2 || C,
								M = R.clone().sub(j).multiplyScalar(.25);
							return e.moveCtrlPoint(u, C.clone().sub(M), "c1"), e.moveCtrlPoint(u, C.clone().add(M), "c2"), P(), void 0
						}
						var b = u.c1,
							Q = u.c2;
						if(b && Q) {
							if(q === H.Mirrored) return e.moveCtrlPoint(u, C.clone().multiplyScalar(2).sub(Q), "c1"), P(), void 0;
							if(q === H.Asymmetric && z === H.Disconnected) {
								var w = b.clone().sub(C).length(),
									M = C.clone().sub(Q).setLength(w).add(C);
								return e.moveCtrlPoint(u, M, "c1"), P(), void 0
							}
						}
						U._firePointChange(), m._interactor.fp("shapePointStatus", z, q)
					}
				}
			}
		}, Zq.prototype._handleDataChanged = function(v) {
			var G = this;
			if(G.screenInfo && G.target) {
				var n = G._interactor;
				G.gatherSingleTarget(n.gv, G.target, !0), G.check(n.gv, null, v ? n._getLogicalPoint(v) : new ss.Math.Vector2(n._lastClientPoint)), n._42()
			}
		}, Zq.prototype.gatherSingleTarget = function(T, y, Y) {
			var g, d, K = this;
			K.screenInfo && K.screenInfo.curve && (d = K.screenInfo.curve._curves);
			var F = K.editing;
			g = F ? K.screenInfo : K.screenInfo = {};
			var q, x, f = y instanceof z.Edge;
			f ? (q = y.s("edge.segments"), x = y.s("edge.points") || new z.List) : (q = y._58O, x = y._59O), g.S = q;
			var Q, V = g.P = [],
				s = ss.getDataMatrix(y);
			if(y instanceof z.Polyline && (Q = y.getElevation() || 0, g.E = []), x.each(function(y) {
					g.E && g.E.push(y.e || Q), y = s.apply(y);
					var X = ss.toScreenPosition(T, y);
					V.push(X.x, X.y)
				}), f) {
				var M = ss.toScreenPosition(T, y._lastSourcePoint),
					B = ss.toScreenPosition(T, y._lastTargetPoint);
				V.splice(0, 0, M.x, M.y), V.push(B.x, B.y)
			}
			if(!g.S || !g.S.size()) {
				g.S = new z.List, g.S.add(1);
				for(var X = 0; X < V.length / 2 - 1; X++) g.S.add(2)
			}
			if((!F || Y) && K.convertToCubicBezier(d), K.activing && (Y || !K.editing || "realPoint" === K.editing.type)) {
				var m = g.curve.findPairs(K.activing.point);
				K.activing.pairs = m
			}
			f && "points" !== y.s("edge.type") && K._writeToHt()
		}, Zq.prototype._convertToNewPoint = function(c, i, g) {
			var v, B, U;
			for(v = 0, B = i.length; B > v; v++) {
				if(U = i[v], U._p1.isNearEnough(c)) return U._p1;
				if(U._p4.isNearEnough(c)) return U._p4
			}
			if(g)
				for(v = 0, B = Math.min(g.length, B); B > v; v++) {
					if(U = g[v], U._p1 === c) return i[v]._p1;
					if(U._p4 === c) return i[v]._p4
				}
		}, Zq.prototype.convertToCubicBezier = function(C) {
			var W, H, w = this,
				b = new ss.Math.Curve,
				z = w.screenInfo;
			if(b.createFromHtShape(z.P, z.S, z.E), z.curve = b, w.activing) {
				var $ = b._curves;
				if(W = w.activing.point, H = w._convertToNewPoint(W, $, C), H && (w.activing.point = H), w.activing.selections) {
					var R = -1,
						T = w.activing.selections;
					T.forEach(function(e) {
						R++, H = w._convertToNewPoint(e, $, C), H && (T[R] = H)
					})
				}
			}
		}, Zq.prototype.check = function(N, b, y) {
			if(!b || z.Default.isLeftButton(b)) {
				var P = this;
				if(P._interactor.setCursor("default"), P.editing = null, P.highlight = null, P.tipInfo = null, P.screenInfo) {
					if(ec()) return P._interactor._42(), !0;
					if(P._checkEditCtrlPoint(y)) return P._interactor._42(), !0;
					if(P._checkEditRealPoint(y)) return P._interactor._42(), !0;
					if(P._checkEditElevation(y)) return P._interactor._42(), !0;
					var k = P.screenInfo.curve,
						h = k.checkPoint(y, P._interactor.getStyle("curveIntersectSize"));
					if(h) {
						var H = P.highlight = {};
						H.type = "insertKnot", H.bezier = h.bezier, H.point = h.intersection
					}
					return P._interactor._42(), !0
				}
			}
		}, Zq.prototype._checkEditRealPoint = function(T) {
			var C, L, U, p, Y, s, k = this,
				H = k.screenInfo.curve._curves,
				$ = k._interactor.getStyle("curvePointIntersectSize"),
				v = 1 / 0;
			for($ *= $, U = 0, p = H.length; p > U; U++) C = H[U], Y = C._p1, s = T.distanceToSquared(Y), v > s && (v = s, L = Y), Y = C._p4, s = T.distanceToSquared(Y), v > s && (v = s, L = Y);
			if(v > $) return !1;
			var R = k.highlight = {};
			return R.type = "changeRealPoint", R.point = L, k.editing = {
				type: "realPoint",
				point: L,
				shiftGuide: {
					point: L.clone(),
					dir: "x",
					limit: 0
				}
			}, k._interactor.setCursor("crosshair"), !0
		}, Zq.prototype._checkEditElevation = function(W) {
			var d = this;
			if(!d._interactor.getStyle("curveElevationVisible")) return !1;
			var H = d.activing;
			if(!H) return !1;
			var c = H.getCurrentEditingPoint();
			if(!c) return !1;
			var s = d._interactor,
				Z = s.getStyle("curveElevationGuideShift"),
				S = s.getStyle("curveElevationIntersectSize"),
				B = W.distanceToSquared({
					x: c.x + Z[0],
					y: c.y + Z[1]
				});
			if(!(B > S * S)) {
				var f = d.highlight = {};
				f.type = "elevation";
				var X = new ss.Math.Vector2(W.x, W.y, c.e);
				return d.editing = {
					type: "elevation",
					startPoint: X
				}, d._interactor.setCursor("crosshair"), !0
			}
		}, Zq.prototype._checkEditCtrlPoint = function(m) {
			var B = this;
			if(B.activing && !B.activing.selections) {
				var C = B.getCurrentSelectintStatus();
				if(C !== ss.Curve.PointType.Straight) {
					var E = B.activing.pairs;
					if(E) {
						var e = B._interactor.getStyle("curvePointIntersectSize");
						e *= e;
						var a, S, s, r, L, p, V, X, I, O = 1 / 0;
						for(V = 0, I = E.length; I > V; V++)
							for(r = E[V], X = 0; 2 > X; X++) L = 0 === X ? "c1" : "c2", r[L] && (p = m.distanceToSquared(r[L]), O > p && (O = p, a = r, S = V, s = L));
						if(O > e) return !1;
						B.activing.hlpair = a, B.activing.hltype = s;
						var t = B.highlight = {};
						return t.type = "changeCtrlPoint", t.point = a[s], B.editing = {
							type: "ctrlPoint",
							pair: a,
							pairId: S,
							ctrlType: s,
							direction: a[s].clone().sub(B.activing.point).normalize()
						}, B._interactor.setCursor("crosshair"), !0
					}
				}
			}
		}, Zq.prototype.startEdit = function(g, f) {
			g.startDragging(f);
			var t = this;
			t.highlight && "insertKnot" === t.highlight.type && (t.insertKnot(), t.gatherSingleTarget(t._interactor.gv, t.target), t.activing = null, t._checkEditRealPoint(t._interactor._getLogicalPoint(f)));
			var X = t._activing;
			if(X) {
				var b = t.editing ? t.editing.type : null;
				"ctrlPoint" === b ? X.editingCtrl = {
					pairId: t.editing.pairId,
					type: X.hltype
				} : "realPoint" === b && (X.editingCtrl = !1)
			}
			var Z = t.highlight,
				y = z.Default.isCtrlDown(f);
			if(!Z || ec()) {
				var B = t._interactor.gv;
				if(!B.setFocus(f) || B._scrolling) return;
				return B.isPannable() && Ln(f) && !y && (t._pan = {
					tx: B.tx(),
					ty: B.ty()
				}, g.fi({
					kind: "beginPan",
					event: f
				})), void 0
			}
			if("changeRealPoint" === Z.type) {
				var e, m = t.activing ? t.activing.point : null,
					C = t.activing ? t.activing.selections : null;
				if(y && t.activing) m === Z.point ? (C ? (t.activing = {
					point: C[0]
				}, C.length > 1 && (C.splice(0, 1), t.activing.selections = C)) : t.activing = null, t.editing = null) : C && (e = C.indexOf(Z.point)) >= 0 ? (C.length > 1 ? C.splice(e, 1) : delete t.activing.selections, t.editing = null) : C ? (C.push(m), t.activing = {
					point: Z.point,
					selections: C
				}) : t.activing = {
					point: Z.point,
					selections: [m]
				};
				else if(C) m === Z.point || ((e = C.indexOf(Z.point)) >= 0 ? (C.splice(e, 1, m), t.activing = {
					point: Z.point,
					selections: C
				}) : t.activing = {
					point: Z.point
				});
				else {
					var M;
					m === Z.point && (M = t.activing.status), t.activing = {
						point: Z.point
					}, M && (t.activing.status = M)
				}
				g.fi({
					kind: "beginEditPoint",
					event: f
				})
			}
		}, Zq.prototype.insertKnot = function() {
			var W = this,
				T = W.highlight,
				C = W.screenInfo.curve;
			C.insertKnot(T.bezier, T.point.t), W._writeToHt()
		}, Zq.prototype._writeToHt = function() {
			var E, U, $, F, y = this,
				W = y.screenInfo.curve,
				a = W.toHtShape(),
				J = a.points,
				i = [],
				I = a.segments,
				C = y._interactor.gv,
				p = y.target,
				j = p instanceof z.Edge,
				P = ss.getDataMatrix(p).invert();
			F = p instanceof z.Polyline, F && ($ = p.getElevation());
			for(var X = 0, n = J.length; n > X; X++) E = J[X], U = ss.toWorldPosition(C, E), U = P.apply(U), E.e != S && E.e !== $ && (U.e = E.e), i.push(U);
			if(p._writing = !0, j) {
				p.s("edge.type", "points"), p.setStyle("edge.segments", I), p.setStyle("edge.points", i.slice(1, i.length - 1)), p.setStyle("edge.source.offset.x", 0), p.setStyle("edge.source.offset.y", 0), p.setStyle("edge.target.offset.x", 0), p.setStyle("edge.target.offset.y", 0);
				var N = y._nextChangeEdgeHost;
				delete y._nextChangeEdgeHost, N && ("source" === N.type ? p.setSource(N.host) : p.setTarget(N.host)), y._writeEdgeHostAnchor("source", i[0]), y._writeEdgeHostAnchor("target", i[i.length - 1])
			} else i.length ? (p.setSegments(I), p.setPoints(i, !0)) : p.removeFromDataModel();
			delete p._writing
		}, Zq.prototype._writeEdgeHostAnchor = function(J, F) {
			var v = this,
				t = v.target,
				k = v._calcHostAnchor(t, J, F);
			t.s("edge." + J + ".anchor.x", k.x), t.s("edge." + J + ".anchor.y", k.y)
		}, Zq.prototype._calcHostAnchor = function(X, n, t, S) {
			S || (S = "source" === n ? X.getSource() : X.getTarget());
			var D = S.getRotation(),
				u = S.getAnchor(),
				h = this._interactor.gv;
			if(Ef(S, h) && (D = 0), D) {
				var L = S.getMatrix(),
					f = L.tfi(t),
					i = S.getSize();
				return {
					x: f.x / i.width + u.x,
					y: f.y / i.height + u.y
				}
			}
			var s = Dq(h, S),
				k = {
					x: (t.x - s.x) / s.width,
					y: (t.y - s.y) / s.height
				};
			return k
		}, Zq.prototype._handlePanning = function(Z) {
			var r = this,
				z = r._pan;
			if(z) {
				z.started = !0;
				var A = r._interactor,
					J = A.gv,
					B = A._lastClientPoint,
					e = Br(Z);
				J.setTranslate(z.tx + e.x - B.x, z.ty + e.y - B.y), r.gatherSingleTarget(A.gv, r.target), A._42(), A.fi({
					kind: "betweenPan",
					event: Z
				})
			}
		}, Zq.prototype.handleEdit = function(u, J) {
			var r = this,
				n = r.editing;
			if(r._pan) return r._handlePanning(J), void 0;
			if(n) {
				n.inEdit = !0;
				var a, E, L, c = r._interactor._getLogicalPoint(J),
					e = z.Default.isCtrlDown(J),
					W = z.Default.isShiftDown(J),
					K = n.type,
					x = r.activing;
				if(r._guideInfo = null, "ctrlPoint" === K && W) {
					var T = r.editing.direction.clone();
					a = x.point;
					var N = T.dot(c.clone().sub(a));
					c = T.setLength(N).add(a)
				} else if("ctrlPoint" === K || "realPoint" === K) {
					var T;
					if("realPoint" === K && W) {
						var h = r.editing.shiftGuide;
						E = h.point;
						var B = Math.abs(c.x - E.x),
							X = Math.abs(c.y - E.y);
						B > X && B > h.limit && "y" === h.dir && (h.dir = "x"), X > B && X > h.limit && "x" === h.dir && (h.dir = "y"), T = h.dir, "x" === T ? (c.y = E.y, h.limit = Math.max(h.limit, B)) : "y" === T && (c.x = E.x, h.limit = Math.max(h.limit, X))
					}
					var C = r._isEditEdgeSourceTarget();
					if(C) {
						var s = r._editEdgeSourceTarget(C, c, e);
						s && (L = s.tipText)
					} else if(!e) {
						var A = r._guidingToEdit(c, T),
							H = "realPoint" === K ? r._interactor.gridGuide.findClosest(c, T, !0) : null,
							i = 1 / 0,
							M = 1 / 0;
						H && (H.x && (i = H.x), H.y && (M = H.y));
						var R = !1;
						A && (A.xList && (Math.abs(A.x) <= Math.abs(i) ? (R = !0, i = A.x) : delete A.xList), A.yList && (Math.abs(A.y) <= Math.abs(M) ? (R = !0, M = A.y) : delete A.yList), R && (r._guideInfo = A)), isFinite(i) && (c.x += i), isFinite(M) && (c.y += M), R && (A.v = c)
					}
				}
				var f = r.screenInfo.curve;
				if("realPoint" === n.type) {
					a = n.point, a.e !== S && (c.e = a.e), f.moveRealPoint(a, c), n.point = c, r.highlight.point = c;
					var o = x.status,
						O = x.selections;
					if(r.activing = {
							point: c,
							status: o
						}, O) {
						var y = c.clone().sub(a),
							p = 0;
						O.forEach(function(J) {
							var I = J.clone().add(y);
							f.moveRealPoint(J, I), O[p++] = I
						}), r.activing.selections = O
					}
				} else if("ctrlPoint" === n.type) {
					var k = x.pairs,
						d = k[n.pairId];
					f.moveCtrlPoint(d, c, n.ctrlType);
					var g = x.status,
						V = ss.Curve.PointType;
					if((g === V.Mirrored || g === V.Asymmetric) && d.c1 && d.c2) {
						var a = new ss.Math.Vector2(x.point),
							Q = "c1" === n.ctrlType ? "c2" : "c1";
						if(g === ss.Curve.PointType.Mirrored) f.moveCtrlPoint(d, a.clone().multiplyScalar(2).sub(c), Q);
						else if(g === V.Asymmetric) {
							var N = d[Q].clone().sub(a).length(),
								P = a.clone().sub(d[n.ctrlType]).setLength(N).add(a);
							isNaN(P.x) || f.moveCtrlPoint(d, P, Q)
						}
					}
					x._firePointChange()
				} else if("elevation" === n.type) {
					E = n.startPoint;
					var Y = E.e + (E.y - c.y) / u._zoom;
					r._setCurrentPointImpl("e", Y), x._firePointChange(), L = "E: " + ss.toFixed(Y)
				}
				var q = z.Default.getLogicalPoint(J, r._interactor._canvas);
				if(q.x += ss.Icons.TipShiftX, q.y += ss.Icons.TipShiftY, !L) {
					var w = ss.toWorldPosition(u, c);
					L = "" + ss.toFixed(w.x) + ", " + ss.toFixed(w.y)
				}
				r.tipInfo = {
					helperPos: q,
					text: L,
					size: L.length
				}, r._writeToHt(), r._interactor.fi({
					kind: "betweenEditPoint",
					event: J
				})
			}
		}, Zq.prototype._setCurrentPointImpl = function(Y, d) {
			var Q = this,
				o = Q._activing;
			if(!o) return !1;
			var w = Q.target;
			if(!w) return !1;
			var M = o.getCurrentEditingPoint();
			if(!M) return !1;
			var X = o.editingCtrl;
			if(!X) var H = M.clone();
			if("e" === Y) M.e = d;
			else {
				var c;
				if("x" === Y || "y" === Y) {
					var x = o._lastFirePoint;
					c = "x" === Y ? {
						x: d,
						y: x ? x.y : 0
					} : {
						x: x ? x.x : 0,
						y: d
					}
				} else "object" == typeof Y ? (c = Y, Y.e !== S && (M.e = Y.e)) : (c = {
					x: arguments[0],
					y: arguments[1]
				}, arguments[2] !== S && (M.e = arguments[2]));
				var F = ss.getDataMatrix(w);
				c = ss.toScreenPosition(Q._interactor.gv, F.apply(c)), M.x = c.x, M.y = c.y
			}
			if(!X) {
				var k = H.multiplyScalar(-1).add(M);
				M.e && H.e && (k.e = M.e - H.e), Q.screenInfo.curve.moveCtrlDueToRealPointMovement(M, k)
			}
			return !0
		}, Zq.prototype.setCurrentPoint = function(w, g) {
			return this._setCurrentPointImpl(w, g) ? (this._writeToHt(), !0) : !1
		}, Zq.prototype._isEditEdgeSourceTarget = function() {
			var B = this,
				O = B.target;
			if(!(O instanceof z.Edge)) return !1;
			var P = B.editing.point,
				f = B.screenInfo.curve._curves;
			return P === f[0]._p1 ? "source" : P === f[f.length - 1]._p4 ? "target" : !1
		}, Zq.prototype._editEdgeSourceTarget = function(_, $, c) {
			var r, k = this,
				Q = k.target;
			if(r = "source" === _ ? Q.getSource() : Q.getTarget()) {
				var T = k._interactor.gv,
					j = ss.toWorldPosition(T, $),
					G = k._calcHostAnchor(Q, _, j, r);
				if(!c) {
					var l = k._interactor.getStyle("anchorRound"),
						e = k._interactor.getStyle("anchorSensitivity");
					G.x = ss.roundTo(G.x, l, e), G.y = ss.roundTo(G.y, l, e)
				}
				if(k._interactor.getStyle("edgeHostDetectPerFrame") || G.x < 0 || G.x > 1 || G.y < 0 || G.y > 1) {
					var A = T.getDataAt(j, function(e) {
						return T.isSelectable(e) ? mm(e) ? !0 : !1 : !1
					});
					if(A) {
						var D = k._calcHostAnchor(Q, _, j, A);
						r = A, k._nextChangeEdgeHost = {
							type: _,
							host: A
						}, G = D, c || (G.x = ss.roundTo(G.x, l, e), G.y = ss.roundTo(G.y, l, e))
					}
				}
				if(!c) {
					var y = Te(T, r, 0, 0, 0, G.x, G.y),
						i = ss.toScreenPosition(T, y);
					$.x = i.x, $.y = i.y
				}
				return k._edgeHostGuideInfo = ss.getTargetCornersOnScreen(T, r), {
					host: r,
					anchor: G,
					tipText: "" + G.x.toFixed(2) + ", " + G.y.toFixed(2)
				}
			}
		}, Zq.prototype._guidingToEdit = function(O, o) {
			var V, i, z = this;
			if(V = z.screenInfo.curve) {
				i = V._curves;
				var _, p, D, k, r, c, b, J, f = 1 / 0,
					L = 1 / 0,
					R = [];
				for(z.editing && "realPoint" === z.editing.type && (J = z.editing.point), r = 0, c = 2 * i.length; c > r; r++) b = i[Math.floor(r / 2)][r % 2 ? "_p4" : "_p1"], R.indexOf(b) >= 0 || (R.push(b), J && J === b || (D = b.x - O.x, k = b.y - O.y, Math.abs(D) < Math.abs(f) ? (f = D, _ = [b]) : D === f && _.push(b), Math.abs(k) < Math.abs(L) ? (L = k, p = [b]) : k === L && p.push(b)));
				var S = z._interactor.getStyle("smartGuideSensitivity");
				if((Math.abs(f) > S || "y" === o) && (_ = null), (Math.abs(L) > S || "x" === o) && (p = null), _ || p) {
					var K = !1,
						e = {};
					if(_ && (K = !0, e.xList = _, e.x = f), p && (K = !0, e.yList = p, e.y = L), K) return e
				}
			}
		}, Zq.prototype._46O = function(I) {
			var _ = this;
			_.editing && (_.editing = null, _._interactor.fi({
				kind: "endEditPoint",
				event: I
			})), _._guideInfo = null, _._edgeHostGuideInfo = null, _._pan && (_._pan = null, _._interactor.fi({
				kind: "endPan",
				event: I
			})), _.tipInfo = null
		}, Zq.prototype._canDeletePoint = function(r, j) {
			var m = this.target;
			if(!(m instanceof z.Edge)) return !0;
			var h = r._curves[0],
				U = r._curves[r._curves.length - 1];
			return h._p1 === j || U._p4 === j ? !1 : !0
		}, Zq.prototype.handleDelete = function() {
			var c = this;
			if(c.activing && c.screenInfo) {
				var W = z.Default.isShiftDown(),
					g = c.screenInfo.curve;
				c._canDeletePoint(g, c.activing.point) && g.deleteRealPoint(c.activing.point, W), c.activing.selections && c.activing.selections.forEach(function(C) {
					c._canDeletePoint(g, C) && g.deleteRealPoint(C, W)
				}), c.activing = null, delete c.editing, delete c.tipInfo, delete c._pan, c._writeToHt(), c._interactor.fp("deleteShapePoint", !1, !0)
			}
		}, Zq.prototype.handleDoubleClick = function(d) {
			var o = this,
				g = o._interactor._getLogicalPoint(d);
			if(o.screenInfo && o._checkEditRealPoint(g)) {
				var m = o.getCurrentSelectintStatus(),
					z = ss.Curve.PointType;
				return m = m === z.Mirrored ? z.Straight : z.Mirrored, o.setCurrentSelectionStatus(m), o._interactor._42(), !0
			}
		}, Zq.prototype._drawHighlight = function(v) {
			var d = this,
				i = d.highlight;
			if(i) {
				var E = i.bezier,
					W = d._interactor;
				E && ss.Icons.DrawIcon(W, v, ss.Icons.ShapeHighlightCurve, [E._p1.x, E._p1.y, E._p2.x, E._p2.y, E._p3.x, E._p3.y, E._p4.x, E._p4.y]);
				var M = i.point;
				M && "insertKnot" === i.type && ss.Icons.DrawIcon(W, v, ss.Icons.ShapeHighlighPoint, M)
			}
		}, Zq.prototype._drawGuide = function(J) {
			var G = this,
				K = G._guideInfo;
			if(K) {
				var n, h, C, I, m = K.v;
				for(n = 0; 2 > n; n++)
					if(I = 0 === n ? K.xList : K.yList)
						for(h = 0, C = I.length; C > h; h++) ss.Icons.DrawIcon(G._interactor, J, ss.Icons.ShapeGuideLine, [m.x, m.y, I[h].x, I[h].y])
			}
		}, Zq.prototype._drawCurrentPoint = function(T) {
			var A = this;
			if(A.activing) {
				var c = A.activing,
					d = A.getCurrentSelectintStatus(),
					B = A._interactor;
				if(d !== ss.Curve.PointType.Straight) {
					var r = c.pairs;
					c.hlpair, c.hltype;
					var O = c.selections,
						L = c.editingCtrl;
					if(r && !O) {
						var y, F, g;
						for(F = 0, g = r.length; g > F; F++) y = r[F], L && F === L.pairId && y[L.type] ? ss.Icons.DrawIcon(B, T, ss.Icons.ShapeActivingCtrl, {
							point: y.point,
							c1: y.c1,
							c2: y.c2,
							hl: L.type
						}) : ss.Icons.DrawIcon(B, T, ss.Icons.ShapeActivingCtrl, y)
					}
				}
				ss.Icons.DrawIcon(B, T, ss.Icons.ShapeHighlighRealPoint, A.activing.point), O && O.forEach(function(Y) {
					ss.Icons.DrawIcon(B, T, ss.Icons.ShapeHighlighRealPoint, Y)
				})
			}
		}, Zq.prototype.clear = function() {
			var X = this;
			X.editing = null, X._guideInfo = null, X.activing = null, X.highlight = null
		}, Zq.prototype._42 = function(L) {
			var K = this;
			K.info = {}, K.editing || (K.screenInfo = null);
			var j = K._interactor;
			if(!j.editDetail) return K.clear(), void 0;
			if(!K.target || !K._interactor.gv.isSelected(K.target) || !K._interactor.gv.isVisible(K.target)) return j.editDetail = !1, K.clear(), void 0;
			if(K.gatherSingleTarget(j.gv, K.target), ss.Icons.DrawIcon(j, L, ss.Icons.ShapeBgCurve, K.screenInfo), K._drawHighlight(L), K._drawCurrentPoint(L), K._getRealPoint().forEach(function(x) {
					ss.Icons.DrawIcon(j, L, ss.Icons.ShapePoint, x)
				}), K._drawGuide(L), K.tipInfo && ss.Icons.DrawIcon(j, L, ss.Icons.TipHelper, K.tipInfo), K._edgeHostGuideInfo && ss.Icons.DrawIcon(j, L, ss.Icons.NodeHoverGuide, K._edgeHostGuideInfo), K._interactor.getStyle("curveElevationVisible") && K.target instanceof z.Polyline && K.activing) {
				var c = K.activing.getCurrentEditingPoint();
				c && ss.Icons.DrawIcon(j, L, ss.Icons.EdgeElevationGuide, c)
			}
		}, Zq.prototype._getRealPoint = function() {
			var S = this.screenInfo,
				o = S.P,
				g = S.S,
				Z = -1,
				P = [];
			return g.each(function(r) {
				var n = 1;
				if(3 === r) n = 2;
				else if(4 === r) n = 3;
				else if(5 === r) return;
				Z += n, P.push({
					x: o[2 * Z],
					y: o[2 * Z + 1]
				})
			}), P
		};
		var ob = ss.MoveHelper = function(l) {
			var C = this;
			C.catalog = "Move", C._interactor = l
		};
		ob.prototype = {}, ob.prototype.constructor = ob, ob.prototype.calcShift = function(F, C, b) {
			var A, O, P = this,
				S = P._interactor.gv,
				g = S.lp(C);
			if("beginMove" === F && P._gatherGridInfo(b._lastLogicalPoint || g), A = P._target) {
				var X = A.downPosition;
				if(X) {
					var f = P._interactor.getStyle("moveSensitivity") / S._zoom;
					if(X.distanceTo(g) < f) return {
						x: 0,
						y: 0
					};
					delete A.downPosition
				}
				var y;
				O = z.Default.isShiftDown(C), O && (g = P._dealShiftDown(g), y = A.shiftGuide.dir);
				var M, s = A.rawPos = {
					x: A.pos.x + g.x - A.lp.x,
					y: A.pos.y + g.y - A.lp.y
				};
				if(z.Default.isCtrlDown(C)) {
					if(M = P._calcShiftByAddon(), P._target.node instanceof ss.Group) {
						var x = P._target.node;
						x._position.x += M.x, x._position.y += M.y
					}
					return M
				}
				for(var B, V = A.x + s.x, c = A.y + s.y, H = {
						x: V,
						y: c
					}, q = {
						x: V + A.w / 2,
						y: c + A.h / 2
					}, Q = {
						x: V + A.w,
						y: c + A.h
					}, K = P._interactor.rectGuide, v = P._interactor.gridGuide, h = [K.findClosest(H, y), K.findClosest(q, y), K.findClosest(Q, y), v.findClosest(H, y), v.findClosest(q, y), v.findClosest(Q, y)], n = 1 / 0, u = 1 / 0, m = 0, J = h.length; J > m; m++) B = h[m], B && (V = B.x, c = B.y, isFinite(V) && Math.abs(V) < Math.abs(n) && (n = V), isFinite(c) && Math.abs(c) < Math.abs(u) && (u = c));
				if(isFinite(n) || (n = 0), isFinite(u) || (u = 0), M = P._calcShiftByAddon(n, u), P._target.node instanceof ss.Group) {
					var x = P._target.node;
					x._position.x += M.x, x._position.y += M.y
				}
				var N = A.node;
				if(!Ef(N, S)) {
					var Y = s.x + n,
						i = s.y + u;
					P._interactor.rectGuide.gatherLines({
						node: N,
						x: A.x + Y,
						y: A.y + i,
						w: A.w,
						h: A.h
					}, y)
				}
				return M
			}
		}, ob.prototype._calcShiftByAddon = function(T, G) {
			var u = this._target,
				i = u.rawPos,
				U = u.node.getPosition();
			return T = T || 0, G = G || 0, {
				x: i.x - U.x + T,
				y: i.y - U.y + G
			}
		}, ob.prototype._dealShiftDown = function(f) {
			var x = this,
				O = x._target.shiftGuide,
				A = x._target.lp,
				J = Math.abs(f.x - A.x),
				s = Math.abs(f.y - A.y);
			J > s && J > O.limit && "y" === O.dir && (O.dir = "x"), s > J && s > O.limit && "x" === O.dir && (O.dir = "y");
			var n = O.dir;
			return "x" === n ? (f.y = A.y, O.limit = Math.max(O.limit, J)) : "y" === n && (f.x = A.x, O.limit = Math.max(O.limit, s)), f
		}, ob.prototype._gatherGridInfo = function(e) {
			var I, z = this,
				c = z._interactor,
				H = c._getValidSelection();
			if(1 === H.length) {
				if(I = H[0], !I.getRect) return z._target = null, void 0
			} else if(I = ss.Group.findOrCreateGroup(H), !I) return z._target = null, void 0;
			var f = I.getPosition(),
				w = I.getRect();
			z._target = {
				node: I,
				x: w.x - f.x,
				y: w.y - f.y,
				w: w.width,
				h: w.height,
				lp: {
					x: e.x,
					y: e.y
				},
				pos: {
					x: f.x,
					y: f.y
				},
				shiftGuide: {
					dir: "x",
					limit: 0
				},
				downPosition: new ss.Math.Vector2(e)
			}, c.rectGuide.gatherRects()
		}, ob.prototype.clear = function() {
			var W = this;
			W._interactor.rectGuide.clear(), W._interactor._42()
		};
		var dd = "directional",
			Mo = "point",
			vd = "spot",
			fq = "light.color",
			Vi = function(S, q) {
				Ol(q) && Fg.test(q) ? mr(S, q) : Ki(q) && q.modelType ? Gl(S, q) : pk[S] = q
			},
			gk = function(M) {
				if(Ki(M)) return M;
				var e = pk[M];
				return M && e === S && Fg.test(M) && (Xk && Xk[M] || mr(M, M)), e
			};
		yi(h, {
			graph3dViewAttributes: _,
			graph3dViewFirstPersonMode: !1,
			graph3dViewMouseRoamable: !0,
			graph3dViewMoveStep: 15,
			graph3dViewRotateStep: V / 60,
			graph3dViewEditHelperDisabled: !1,
			graph3dViewPannable: !0,
			graph3dViewRotatable: !0,
			graph3dViewWalkable: !0,
			graph3dViewResettable: !0,
			graph3dViewZoomable: !0,
			graph3dViewRectSelectable: !0,
			graph3dViewRectSelectBackground: Wc,
			graph3dViewGridVisible: !1,
			graph3dViewGridSize: 50,
			graph3dViewGridGap: 50,
			graph3dViewGridColor: [.4, .75, .85, 1],
			graph3dViewOriginAxisVisible: !1,
			graph3dViewCenterAxisVisible: !1,
			graph3dViewAxisXColor: [1, 0, 0, 1],
			graph3dViewAxisYColor: [0, 1, 0, 1],
			graph3dViewAxisZColor: [0, 0, 1, 1],
			graph3dViewEditSizeColor: [1, 1, 0, 1],
			graph3dViewOrtho: !1,
			graph3dViewOrthoWidth: 2e3,
			graph3dViewFovy: V / 4,
			graph3dViewNear: 10,
			graph3dViewFar: 1e4,
			graph3dViewEye: [0, 300, 1e3],
			graph3dViewCenter: [0, 0, 0],
			graph3dViewUp: [0, 1, -1e-7],
			graph3dViewHeadlightRange: 0,
			graph3dViewHeadlightColor: [1, 1, 1, 1],
			graph3dViewHeadlightIntensity: 1,
			graph3dViewHeadlightDisabled: !1,
			graph3dViewFogDisabled: !0,
			graph3dViewFogColor: "white",
			graph3dViewFogNear: 1,
			graph3dViewFogFar: 2e3,
			graph3dViewDashDisabled: !0,
			graph3dViewBatchBlendDisabled: !0,
			graph3dViewBatchBrightnessDisabled: !0,
			graph3dViewBatchColorDisabled: !1,
			setShape3dModel: Vi,
			getShape3dModel: gk,
			createMatrix: function(c, w) {
				An(c) || (c = [c]);
				for(var C = c.length - 1; C >= 0; C--) {
					var n = c[C];
					w = Uj(n.mat, n.s3, n.r3, n.rotationMode, n.t3, w)
				}
				return w
			},
			transformVec: function(P, F) {
				return ph(P, F)
			},
			createBoxModel: function() {
				return {
					vs: wj,
					ns: Ad,
					uv: vo,
					is: js
				}
			},
			createRoundRectModel: function($, X) {
				return Ue.roundRect($, X)
			},
			createStarModel: function(U, M) {
				return Ue.star(U, M)
			},
			createRectModel: function(f, V) {
				return Ue.rect(f, V)
			},
			createTriangleModel: function(p, h) {
				return Ue.triangle(p, h)
			},
			createRightTriangleModel: function(w, z) {
				return Ue.rightTriangle(w, z)
			},
			createParallelogramModel: function(l, E) {
				return Ue.parallelogram(l, E)
			},
			createTrapezoidModel: function(N, e) {
				return Ue.trapezoid(N, e)
			},
			createSmoothSphereModel: function(j, E, y, r, _, Z, k) {
				return Xb(new Wl(j, E, y, r, _, Z, k))
			},
			createSphereModel: function(T, r, V, w, g, G) {
				return T ? zq(T, r, V, w, g, G) : h.createSmoothSphereModel()
			},
			createSmoothConeModel: function($, w, j, G, l) {
				return Kj($, w, j, G, l)
			},
			createConeModel: function(J, O, b, a, n, Q) {
				return J ? ue(J, O, b, a, n, Q) : Kj(Q)
			},
			createSmoothCylinderModel: function($, P, x, j, Z, N, c, k) {
				return Xb(new _l($, P, x, j, Z, N, c, k))
			},
			createCylinderModel: function(B, E, f, T, X, n, p) {
				return B ? Ar(B, E, f, T, X, n, p) : Vm(n, p)
			},
			createSmoothTorusModel: function(N, w, F, c, $, y) {
				return Xb(new qf(N, w, F, c, $, y))
			},
			createTorusModel: function(F, u, p, g, B, P, r) {
				return F ? We(F, u, p, g, B, P, r) : zb(P, r)
			},
			createExtrusionModel: function(Y, f, R, J, i, y, s, I) {
				return Eb(Y, f, R, J, i, y, s, I)
			},
			createSmoothRingModel: function(w, T, o, g, J, e) {
				for(var $ = [], X = 0; X < w.length - 1; X += 2) $.push({
					x: w[X],
					y: w[X + 1]
				});
				for(w = Lh($, T, o)[0], $ = [], X = 0; X < w.length; X++) {
					var y = w[X];
					$.push(new ze(y.x, 0, y.y))
				}
				return Xb(new Ni($, e, g, J))
			},
			createTextGeometry: function(J, k) {
				return Xb(new bm(J, k))
			},
			loadFontFace: function(s, Q) {
				h.xhrLoad(s, function(H) {
					if(!H) return Q();
					var $;
					try {
						$ = JSON.parse(H)
					} catch(j) {
						$ = JSON.parse(H.substring(65, H.length - 2))
					}
					rk.loadFace($), Q && Q($.familyName.toLowerCase())
				}, Q ? null : {
					sync: !0
				})
			},
			getRotationFromMatrix4: function(w, K) {
				var P = J,
					p = w[0],
					T = w[4],
					R = w[8],
					Q = w[1],
					N = w[5],
					_ = w[9],
					I = w[2],
					s = w[6],
					M = w[10];
				K = K || "xyz", K = K[2] + K[1] + K[0], K = K.toUpperCase();
				var C = {};
				if("XYZ" === K) C._y = Math.asin(P(R, -1, 1)), Math.abs(R) < .99999 ? (C._x = Math.atan2(-_, M), C._z = Math.atan2(-T, p)) : (C._x = Math.atan2(s, N), C._z = 0);
				else if("YXZ" === K) C._x = Math.asin(-P(_, -1, 1)), Math.abs(_) < .99999 ? (C._y = Math.atan2(R, M), C._z = Math.atan2(Q, N)) : (C._y = Math.atan2(-I, p), C._z = 0);
				else if("ZXY" === K) C._x = Math.asin(P(s, -1, 1)), Math.abs(s) < .99999 ? (C._y = Math.atan2(-I, M), C._z = Math.atan2(-T, N)) : (C._y = 0, C._z = Math.atan2(Q, p));
				else if("ZYX" === K) C._y = Math.asin(-P(I, -1, 1)), Math.abs(I) < .99999 ? (C._x = Math.atan2(s, M), C._z = Math.atan2(Q, p)) : (C._x = 0, C._z = Math.atan2(-T, N));
				else if("YZX" === K) C._z = Math.asin(P(Q, -1, 1)), Math.abs(Q) < .99999 ? (C._x = Math.atan2(-_, N), C._y = Math.atan2(-I, p)) : (C._x = 0, C._y = Math.atan2(R, M));
				else {
					if("XZY" !== K) return null;
					C._z = Math.asin(-P(T, -1, 1)), Math.abs(T) < .99999 ? (C._x = Math.atan2(s, N), C._y = Math.atan2(R, p)) : (C._x = Math.atan2(-_, M), C._y = 0)
				}
				return [C._x, C._y, C._z]
			},
			createRingModel: function(Z, r, H, M, d, R, f, k, U, c) {
				for(var o = [], e = 0; e < Z.length - 1; e += 2) o.push({
					x: Z[e],
					y: Z[e + 1]
				});
				R = R || h.shapeSide, f = f || 0, k = k || R;
				var i, b, x, J, X, T, u, V, P, g, e, D, q, W, p, t, l, w, N = [],
					n = [],
					S = U ? [] : _,
					I = U ? [] : _,
					v = c ? [] : _,
					a = c ? [] : _,
					O = M ? [] : _,
					m = M ? [] : _,
					j = d ? [] : _,
					C = d ? [] : _,
					Z = Lh(o, r, H),
					y = pg(Z),
					A = 0,
					K = 2 * Math.PI / R;
				return Z.forEach(function(F) {
					if(x = F.length, x > 1) {
						if(J = F[0], M)
							for(T = J.x, V = J.y, e = f; k > e; e++) D = e + 1, q = e * K, W = D * K, p = s(q), t = L(q), l = s(W), w = L(W), O.push(p * T, V, -t * T, l * T, V, -w * T, 0, V, 0), m.push(.5 - .5 * p, .5 - .5 * t, .5 - .5 * l, .5 - .5 * w, .5, .5);
						for(g = 0; x > g; g++) {
							for(X = F[g], T = J.x, u = X.x, V = J.y, P = X.y, i = A / y, A += uh(J, X), b = A / y, e = f; k > e; e++) D = e + 1, q = e * K, W = D * K, p = s(q), t = L(q), l = s(W), w = L(W), N.push(p * u, P, -t * u, l * u, P, -w * u, p * T, V, -t * T, l * u, P, -w * u, l * T, V, -w * T, p * T, V, -t * T), n.push(e / R, b, D / R, b, e / R, i, D / R, b, D / R, i, e / R, i), U && e === f && (S.push(0, V, 0, 0, P, 0, p * u, P, -t * u, p * u, P, -t * u, p * T, V, -t * T, 0, V, 0), I.push(0, .5 - V, 0, .5 - P, 2 * u, .5 - P, 2 * u, .5 - P, 2 * T, .5 - V, 0, .5 - V)), c && D === k && (v.push(0, V, 0, l * u, P, -w * u, 0, P, 0, l * u, P, -w * u, 0, V, 0, l * T, V, -w * T), a.push(1, .5 - V, 1 - 2 * u, .5 - P, 1, .5 - P, 1 - 2 * u, .5 - P, 1, .5 - V, 1 - 2 * T, .5 - V));
							J = X
						}
						if(d)
							for(T = J.x, V = J.y, e = f; k > e; e++) D = e + 1, q = e * K, W = D * K, p = s(q), t = L(q), l = s(W), w = L(W), j.push(l * T, V, -w * T, p * T, V, -t * T, 0, V, 0), C.push(.5 - .5 * l, .5 + .5 * w, .5 - .5 * p, .5 + .5 * t, .5, .5)
					}
				}), {
					vs: N,
					uv: n,
					bottom_vs: j,
					bottom_uv: C,
					top_vs: O,
					top_uv: m,
					from_vs: S,
					from_uv: I,
					to_vs: v,
					to_uv: a
				}
			}
		}, !0), yi(Q, {
			"3d.move.mode": S,
			"3d.selectable": !0,
			"3d.visible": !0,
			"3d.movable": !0,
			"3d.editable": !0,
			"shape.border.gradient.color": S,
			"edge.gradient.color": S,
			"edge.source.t3": S,
			"edge.target.t3": S,
			"light.type": Mo,
			"light.center": [0, 0, 0],
			"light.color": [1, 1, 1, 1],
			"light.disabled": !1,
			"light.angle": V / 4,
			"light.range": 0,
			"light.exponent": 1,
			"light.intensity": 1,
			"wf.visible": !1,
			"wf.width": 1,
			"wf.color": om,
			"wf.short": !1,
			"wf.mat": S,
			"wf.geometry": !1,
			batch: S,
			"transparent.mask": !1,
			brightness: S,
			"select.brightness": .7,
			"repeat.uv.length": S,
			alphaTest: .4,
			"label.face": np,
			"label.t3": S,
			"label.r3": S,
			"label.texture.scale": 2,
			"label.rotationMode": Hd,
			"label.light": !1,
			"label.blend": S,
			"label.reverse.flip": !1,
			"label.reverse.color": nj,
			"label.reverse.cull": !1,
			"label.transparent": !1,
			"label.autorotate": !1,
			"label2.face": np,
			"label2.t3": S,
			"label2.r3": S,
			"label2.texture.scale": 2,
			"label2.rotationMode": Hd,
			"label2.light": !1,
			"label2.blend": S,
			"label2.reverse.flip": !1,
			"label2.reverse.color": nj,
			"label2.reverse.cull": !1,
			"label2.transparent": !1,
			"label2.autorotate": !1,
			"note.face": np,
			"note.t3": S,
			"note.r3": S,
			"note.texture.scale": 2,
			"note.rotationMode": Hd,
			"note.light": !1,
			"note.blend": S,
			"note.reverse.flip": !1,
			"note.reverse.color": nj,
			"note.reverse.cull": !1,
			"note.transparent": !1,
			"note.autorotate": !1,
			"note2.face": np,
			"note2.t3": S,
			"note2.r3": S,
			"note2.texture.scale": 2,
			"note2.rotationMode": Hd,
			"note2.light": !1,
			"note2.blend": S,
			"note2.reverse.flip": !1,
			"note2.reverse.color": nj,
			"note2.reverse.cull": !1,
			"note2.transparent": !1,
			"note2.autorotate": !1,
			shape3d: S,
			"shape3d.color": Hc,
			"shape3d.top.color": S,
			"shape3d.bottom.color": S,
			"shape3d.from.color": S,
			"shape3d.to.color": S,
			"shape3d.image": S,
			"shape3d.top.image": S,
			"shape3d.bottom.image": S,
			"shape3d.from.image": S,
			"shape3d.to.image": S,
			"shape3d.light": !0,
			"shape3d.side": 0,
			"shape3d.side.from": S,
			"shape3d.side.to": S,
			"shape3d.visible": !0,
			"shape3d.from.visible": !0,
			"shape3d.to.visible": !0,
			"shape3d.top.visible": !0,
			"shape3d.bottom.visible": !0,
			"shape3d.torus.radius": .17,
			"shape3d.resolution": 0,
			"shape3d.blend": S,
			"shape3d.opacity": S,
			"shape3d.reverse.flip": !1,
			"shape3d.reverse.color": nj,
			"shape3d.reverse.cull": !1,
			"shape3d.transparent": !1,
			"shape3d.uv.offset": S,
			"shape3d.uv.scale": S,
			"shape3d.top.uv.offset": S,
			"shape3d.top.uv.scale": S,
			"shape3d.bottom.uv.offset": S,
			"shape3d.bottom.uv.scale": S,
			"shape3d.from.uv.offset": S,
			"shape3d.from.uv.scale": S,
			"shape3d.to.uv.offset": S,
			"shape3d.to.uv.scale": S,
			"shape3d.top.cap": S,
			"shape3d.bottom.cap": S,
			"shape3d.start.angle": 0,
			"shape3d.sweep.angle": Z,
			"shape3d.discard.selectable": !0,
			"shape3d.top.discard.selectable": !0,
			"shape3d.bottom.discard.selectable": !0,
			"shape3d.from.discard.selectable": !0,
			"shape3d.to.discard.selectable": !0,
			"shape3d.scaleable": !0,
			"shape3d.autorotate": !1,
			"shape3d.fixSizeOnScreen": S,
			"shape3d.image.cache": !1,
			"shape3d.alwaysOnTop": !1,
			"all.light": !0,
			"all.visible": !0,
			"all.color": Hc,
			"all.image": S,
			"all.blend": S,
			"all.opacity": S,
			"all.reverse.flip": !1,
			"all.reverse.color": nj,
			"all.reverse.cull": !1,
			"all.transparent": !1,
			"all.uv": S,
			"all.uv.offset": S,
			"all.uv.scale": S,
			"all.discard.selectable": !0,
			mat: S,
			"left.mat": S,
			"right.mat": S,
			"top.mat": S,
			"bottom.mat": S,
			"front.mat": S,
			"back.mat": S
		}, !0);
		var xg, kq = !1,
			Kg = [0, 0, 0, 0],
			Io = {
				left: [1 / 255, 0, 0, 1],
				right: [2 / 255, 0, 0, 1],
				top: [3 / 255, 0, 0, 1],
				bottom: [4 / 255, 0, 0, 1],
				front: [5 / 255, 0, 0, 1],
				back: [6 / 255, 0, 0, 1],
				m: {
					1: vr,
					2: Td,
					3: Pi,
					4: ed,
					5: np,
					6: Cp
				}
			},
			gh = function(o, w, j, m) {
				if(w.getFaceVisible(o, j)) {
					Jd(w, el(o, w.getFaceMat(o, j) || w.getMat(o)));
					var h = w._26I;
					w.getFaceReverseCull(o, j) ? h.enable(h.CULL_FACE) : h.disable(h.CULL_FACE), Me(h, w._prg.uFixPickReverseColor, Io[j]), Em(h), zc(h, m, 6), Tp(h), Qk(w)
				}
			},
			gm = function(M) {
				return M instanceof sh
			},
			nk = function(u) {
				return [u.x, u.e || 0, u.y]
			},
			Ul = function(c, a, o) {
				for(var a = Qq(a), b = a[0], O = a[1], G = a[2]; o--;) c.push(b, O, G)
			},
			Af = function(G, P, u) {
				for(var P = Qq(P), l = P[0], R = P[1], f = P[2], o = P[3]; u--;) G.push(l, R, f, o)
			},
			cg = function(y, l, Y) {
				if(l)
					for(var r, P, a, Z = l[0], X = l[1], H = l[2], e = l[4], _ = l[5], S = l[6], c = l[8], p = l[9], g = l[10], u = l[12], b = l[13], Q = l[14], K = Y.length, V = 0, V = 0; K > V; V += 3) r = Y[V], P = Y[V + 1], a = Y[V + 2], y.push(Z * r + e * P + c * a + u, X * r + _ * P + p * a + b, H * r + S * P + g * a + Q);
				else Fo(y, Y)
			},
			po = function(i, L) {
				var K = L.s("light.intensity"),
					h = Qq(L.s(fq)),
					u = h[0],
					R = h[1],
					P = h[2];
				1 !== K && (u *= K, R *= K, P *= K), i.push(u, R, P, L.s("light.disabled") ? 1 : 0)
			},
			as = function(G, S, m) {
				Me(S, m.uHeadlightRange, G._headlightRange);
				var V = G._headlightIntensity,
					Z = Qq(G._headlightColor);
				1 !== V && (Z = [Z[0] * V, Z[1] * V, Z[2] * V]), Me(S, m.uHeadlightColor, [Z[0], Z[1], Z[2], G._headlightDisabled ? 1 : 0]);
				var f = G._59O,
					X = G._spots,
					g = G._dirs;
				if(f.length) {
					var I = [],
						Y = [],
						v = [];
					f.forEach(function(e) {
						po(I, e), Fo(Y, G._transformPointToViewSpace(e.p3())), v.push(e.s("light.range"))
					}), S.uniform4fv(m.uPointColor, I), S.uniform1fv(m.uPointRange, v), S.uniform3fv(m.uPointPosition, Y)
				}
				if(X.length) {
					var w = [],
						y = [],
						z = [],
						E = [],
						i = [],
						H = [];
					X.forEach(function(u) {
						po(w, u), Fo(y, G._transformPointToViewSpace(u.p3())), Fo(i, G._transformDirectionToViewSpace(u.p3(), u.s("light.center"))), z.push(u.s("light.range")), E.push(s(u.s("light.angle") / 2)), H.push(u.s("light.exponent"))
					}), S.uniform4fv(m.uSpotColor, w), S.uniform1fv(m.uSpotRange, z), S.uniform1fv(m.uSpotAngle, E), S.uniform1fv(m.uSpotExponent, H), S.uniform3fv(m.uSpotPosition, y), S.uniform3fv(m.uSpotDirection, i)
				}
				if(g.length) {
					var U = [],
						d = [];
					g.forEach(function(D) {
						po(U, D), Fo(d, G._transformDirectionToViewSpace(D.p3()))
					}), S.uniform4fv(m.uDirColor, U), S.uniform3fv(m.uDirDirection, d)
				}
			},
			vc = function(B) {
				return B > 0 && 0 === (B - 1 & B)
			},
			Po = function(L) {
				return L = N(0, R(V, L)), L = N(Rc, R(V - Rc, L))
			},
			Lq = function() {
				return .05 + T() / 2
			},
			pb = function(M, s, b, N) {
				var n, O = M.getEye();
				return M.isOrtho() ? (n = Jn(M.getCenter(), O), n[0] += N[0], n[1] += N[1], n[2] += N[2]) : n = O, Hp(s, b, N, n)
			},
			Hp = function(h, Z, z, N) {
				var X = Yg(h, Z),
					e = Jn(N, z, !0),
					r = Yg(e, Z);
				if(d(r) < Rc) return _;
				var l = (X - Yg(z, Z)) / r;
				return [z[0] + e[0] * l, z[1] + e[1] * l, z[2] + e[2] * l]
			},
			mi = function(x, c) {
				return {
					x: 2 * x.x - c.x,
					y: 2 * x.y - c.y
				}
			},
			Kc = function(F, o, R, f) {
				var C, Z;
				if(!F) return C = c(o.y - R.y, R.x - o.x), {
					x: o.x + f * L(C),
					y: o.y + f * s(C)
				};
				if(!R) return C = c(F.y - o.y, o.x - F.x), {
					x: o.x + f * L(C),
					y: o.y + f * s(C)
				};
				var I = Jn([F.x, F.y, 0], [o.x, o.y, 0], !0),
					M = Jn([R.x, R.y, 0], [o.x, o.y, 0], !0),
					W = -(I[0] + M[0]) / 2,
					m = -(I[1] + M[1]) / 2,
					e = n(W * W + m * m);
				if(Rc > e) return C = c(F.y - o.y, o.x - F.x), {
					x: o.x + f * L(C),
					y: o.y + f * s(C)
				};
				var r = F.x - o.x,
					z = F.y - o.y,
					g = R.x - o.x,
					k = R.y - o.y,
					u = n(r * r + z * z),
					T = n(g * g + k * k);
				C = G(Yg(I, M)) / 2, Z = I[1] * M[0] - I[0] * M[1] > 0 ? -1 : 1, W /= e, m /= e;
				var D = f / L(C),
					Y = N(u, T) / s(C);
				e = Math.min(D, Y);
				var l = {
					x: o.x + Z * e * W,
					y: o.y + Z * e * m
				};
				return R.b && D > T / s(C) && (l.adjust = !0), l
			},
			Xj = function(u) {
				var W = u[1],
					E = u[2],
					d = u[3],
					R = u[6],
					z = u[7],
					O = u[11];
				u[1] = u[4], u[2] = u[8], u[3] = u[12], u[4] = W, u[6] = u[9], u[7] = u[13], u[8] = E, u[9] = R, u[11] = u[14], u[12] = d, u[13] = z, u[14] = O
			},
			Gn = function(G) {
				var e = G[0],
					z = G[1],
					p = G[2],
					M = G[3],
					E = G[4],
					X = G[5],
					L = G[6],
					l = G[7],
					r = G[8],
					U = G[9],
					t = G[10],
					C = G[11],
					w = G[12],
					P = G[13],
					b = G[14],
					F = G[15],
					I = e * X - z * E,
					K = e * L - p * E,
					c = e * l - M * E,
					N = z * L - p * X,
					S = z * l - M * X,
					T = p * l - M * L,
					O = r * P - U * w,
					k = r * b - t * w,
					m = r * F - C * w,
					d = U * b - t * P,
					H = U * F - C * P,
					q = t * F - C * b,
					i = I * q - K * H + c * d + N * m - S * k + T * O;
				return i ? (i = 1 / i, G[0] = (X * q - L * H + l * d) * i, G[1] = (p * H - z * q - M * d) * i, G[2] = (P * T - b * S + F * N) * i, G[3] = (t * S - U * T - C * N) * i, G[4] = (L * m - E * q - l * k) * i, G[5] = (e * q - p * m + M * k) * i, G[6] = (b * c - w * T - F * K) * i, G[7] = (r * T - t * c + C * K) * i, G[8] = (E * H - X * m + l * O) * i, G[9] = (z * m - e * H - M * O) * i, G[10] = (w * S - P * c + F * I) * i, G[11] = (U * c - r * S - C * I) * i, G[12] = (X * k - E * d - L * O) * i, G[13] = (e * d - z * k + p * O) * i, G[14] = (P * K - w * N - b * I) * i, G[15] = (r * N - U * K + t * I) * i, void 0) : _
			},
			lg = function(V, b) {
				if(b) {
					var m = b[0],
						u = b[1],
						T = b[2];
					V[12] = V[0] * m + V[4] * u + V[8] * T + V[12], V[13] = V[1] * m + V[5] * u + V[9] * T + V[13], V[14] = V[2] * m + V[6] * u + V[10] * T + V[14], V[15] = V[3] * m + V[7] * u + V[11] * T + V[15]
				}
			},
			Tc = function(m, f) {
				if(f) {
					var B = f[0],
						V = f[1],
						x = f[2];
					m[0] = m[0] * B, m[1] = m[1] * B, m[2] = m[2] * B, m[3] = m[3] * B, m[4] = m[4] * V, m[5] = m[5] * V, m[6] = m[6] * V, m[7] = m[7] * V, m[8] = m[8] * x, m[9] = m[9] * x, m[10] = m[10] * x, m[11] = m[11] * x
				}
			},
			Zl = function(M, Z, E) {
				var N = Z[0],
					t = Z[1],
					J = Z[2],
					Q = Z[3],
					q = Z[4],
					S = Z[5],
					C = Z[6],
					s = Z[7],
					P = Z[8],
					r = Z[9],
					A = Z[10],
					u = Z[11],
					d = Z[12],
					V = Z[13],
					K = Z[14],
					T = Z[15],
					U = E[0],
					H = E[1],
					W = E[2],
					p = E[3];
				return M[0] = U * N + H * q + W * P + p * d, M[1] = U * t + H * S + W * r + p * V, M[2] = U * J + H * C + W * A + p * K, M[3] = U * Q + H * s + W * u + p * T, U = E[4], H = E[5], W = E[6], p = E[7], M[4] = U * N + H * q + W * P + p * d, M[5] = U * t + H * S + W * r + p * V, M[6] = U * J + H * C + W * A + p * K, M[7] = U * Q + H * s + W * u + p * T, U = E[8], H = E[9], W = E[10], p = E[11], M[8] = U * N + H * q + W * P + p * d, M[9] = U * t + H * S + W * r + p * V, M[10] = U * J + H * C + W * A + p * K, M[11] = U * Q + H * s + W * u + p * T, U = E[12], H = E[13], W = E[14], p = E[15], M[12] = U * N + H * q + W * P + p * d, M[13] = U * t + H * S + W * r + p * V, M[14] = U * J + H * C + W * A + p * K, M[15] = U * Q + H * s + W * u + p * T, M
			},
			gf = function(g, X, q, K) {
				var l, A, w, p, Z, s, H, S, Y, B, E = X[0],
					M = X[1],
					z = X[2],
					V = K[0],
					a = K[1],
					k = K[2],
					u = q[0],
					O = q[1],
					U = q[2];
				return d(E - u) < Rc && d(M - O) < Rc && d(z - U) < Rc ? Cm(g) : (H = E - u, S = M - O, Y = z - U, B = 1 / n(H * H + S * S + Y * Y), H *= B, S *= B, Y *= B, l = a * Y - k * S, A = k * H - V * Y, w = V * S - a * H, B = n(l * l + A * A + w * w), B ? (B = 1 / B, l *= B, A *= B, w *= B) : (l = 0, A = 0, w = 0), p = S * w - Y * A, Z = Y * l - H * w, s = H * A - S * l, B = n(p * p + Z * Z + s * s), B ? (B = 1 / B, p *= B, Z *= B, s *= B) : (p = 0, Z = 0, s = 0), g[0] = l, g[1] = p, g[2] = H, g[3] = 0, g[4] = A, g[5] = Z, g[6] = S, g[7] = 0, g[8] = w, g[9] = s, g[10] = Y, g[11] = 0, g[12] = -(l * E + A * M + w * z), g[13] = -(p * E + Z * M + s * z), g[14] = -(H * E + S * M + Y * z), g[15] = 1, g)
			},
			wo = function(O, D, r, h, A) {
				var i = 1 / l(D / 2),
					d = 1 / (h - A);
				return O[0] = i / r, O[1] = 0, O[2] = 0, O[3] = 0, O[4] = 0, O[5] = i, O[6] = 0, O[7] = 0, O[8] = 0, O[9] = 0, O[10] = (A + h) * d, O[11] = -1, O[12] = 0, O[13] = 0, O[14] = 2 * A * h * d, O[15] = 0, O
			},
			ro = function(h, A, f, z, x, c, v) {
				var S = 1 / (A - f),
					L = 1 / (z - x),
					Z = 1 / (c - v);
				return h[0] = -2 * S, h[1] = 0, h[2] = 0, h[3] = 0, h[4] = 0, h[5] = -2 * L, h[6] = 0, h[7] = 0, h[8] = 0, h[9] = 0, h[10] = 2 * Z, h[11] = 0, h[12] = (A + f) * S, h[13] = (x + z) * L, h[14] = (v + c) * Z, h[15] = 1, h
			},
			_j = function(v, C) {
				var o = C[0],
					E = C[1],
					A = C[2],
					b = C[3],
					P = o * o + E * E + A * A + b * b,
					n = P ? 1 / P : 0;
				return v[0] = -o * n, v[1] = -E * n, v[2] = -A * n, v[3] = b * n, v
			},
			jj = function(F, m) {
				var H = m[0] + m[5] + m[10],
					h = 0;
				return H > 0 ? (h = 2 * Math.sqrt(H + 1), F[3] = .25 * h, F[0] = (m[6] - m[9]) / h, F[1] = (m[8] - m[2]) / h, F[2] = (m[1] - m[4]) / h) : m[0] > m[5] & m[0] > m[10] ? (h = 2 * Math.sqrt(1 + m[0] - m[5] - m[10]), F[3] = (m[6] - m[9]) / h, F[0] = .25 * h, F[1] = (m[1] + m[4]) / h, F[2] = (m[8] + m[2]) / h) : m[5] > m[10] ? (h = 2 * Math.sqrt(1 + m[5] - m[0] - m[10]), F[3] = (m[8] - m[2]) / h, F[0] = (m[1] + m[4]) / h, F[1] = .25 * h, F[2] = (m[6] + m[9]) / h) : (h = 2 * Math.sqrt(1 + m[10] - m[0] - m[5]), F[3] = (m[1] - m[4]) / h, F[0] = (m[8] + m[2]) / h, F[1] = (m[6] + m[9]) / h, F[2] = .25 * h), F
			},
			op = function(O, U, P) {
				var Z = U[0],
					k = U[1],
					Q = U[2],
					u = U[3],
					h = Z + Z,
					C = k + k,
					l = Q + Q,
					G = Z * h,
					v = Z * C,
					F = Z * l,
					W = k * C,
					K = k * l,
					_ = Q * l,
					T = u * h,
					y = u * C,
					N = u * l;
				return O[0] = 1 - (W + _), O[1] = v + N, O[2] = F - y, O[3] = 0, O[4] = v - N, O[5] = 1 - (G + _), O[6] = K + T, O[7] = 0, O[8] = F + y, O[9] = K - T, O[10] = 1 - (G + W), O[11] = 0, O[12] = P[0], O[13] = P[1], O[14] = P[2], O[15] = 1, O
			},
			Gf = h.getRotationFromMatrix4,
			Uh = function() {
				var s = [0, 0, 0],
					S = [0, 0, 0],
					d = [0, 0, 0],
					L = function(Y, q, u) {
						Y[0] = q[1] * u[2] - q[2] * u[1], Y[1] = q[2] * u[0] - q[0] * u[2], Y[2] = q[0] * u[1] - q[1] * u[0]
					},
					B = function(v) {
						return v[0] * v[0] + v[1] * v[1] + v[2] * v[2]
					},
					h = function(n) {
						var p = Math.sqrt(B(n));
						n[0] /= p, n[1] /= p, n[2] /= p
					},
					i = function(U, c, P) {
						U[0] = c[0] - P[0], U[1] = c[1] - P[1], U[2] = c[2] - P[2]
					};
				return function(N, t, G) {
					var f = Wh();
					return i(d, N, t), 0 === B(d) && (d[2] = 1), h(d), L(s, G, d), 0 === B(s) && (1 === Math.abs(G[2]) ? d[0] += 1e-4 : d[2] += 1e-4, h(d), L(s, G, d)), h(s), L(S, d, s), f[0] = s[0], f[4] = S[0], f[8] = d[0], f[1] = s[1], f[5] = S[1], f[9] = d[1], f[2] = s[2], f[6] = S[2], f[10] = d[2], f
				}
			}(),
			Qb = function(J, p) {
				return gf(p ? p : Wh(), J._eye, J._center, J._up)
			},
			Sn = function(F) {
				var D = F.getAspect(),
					V = F._near,
					v = F._far,
					H = Wh();
				if(F._ortho) {
					var B = F._orthoWidth / 2,
						u = B / D;
					ro(H, -B, B, -u, u, V, v)
				} else wo(H, F._fovy, D, V, v);
				return H
			},
			ic = function(k, W) {
				if(!k) return _;
				var G = 0,
					b = 1,
					R = 2,
					S = [],
					E = 0,
					V = k.length,
					X = V / 3;
				if(W) {
					for(; V > E; E++) S[E] = 0;
					for(E = 0; E < W.length; E += 3) {
						var K = [],
							T = [],
							u = [];
						K[G] = k[3 * W[E + 1] + G] - k[3 * W[E] + G], K[b] = k[3 * W[E + 1] + b] - k[3 * W[E] + b], K[R] = k[3 * W[E + 1] + R] - k[3 * W[E] + R], T[G] = k[3 * W[E + 2] + G] - k[3 * W[E + 1] + G], T[b] = k[3 * W[E + 2] + b] - k[3 * W[E + 1] + b], T[R] = k[3 * W[E + 2] + R] - k[3 * W[E + 1] + R], u[G] = K[b] * T[R] - K[R] * T[b], u[b] = K[R] * T[G] - K[G] * T[R], u[R] = K[G] * T[b] - K[b] * T[G];
						for(var h = 0; 3 > h; h++) S[3 * W[E + h] + G] += u[G], S[3 * W[E + h] + b] += u[b], S[3 * W[E + h] + R] += u[R]
					}
				} else
					for(E = 0; X > E; E += 3) {
						var K = [],
							T = [],
							u = [];
						K[G] = k[3 * (E + 1) + G] - k[3 * E + G], K[b] = k[3 * (E + 1) + b] - k[3 * E + b], K[R] = k[3 * (E + 1) + R] - k[3 * E + R], T[G] = k[3 * (E + 2) + G] - k[3 * (E + 1) + G], T[b] = k[3 * (E + 2) + b] - k[3 * (E + 1) + b], T[R] = k[3 * (E + 2) + R] - k[3 * (E + 1) + R], u[G] = K[b] * T[R] - K[R] * T[b], u[b] = K[R] * T[G] - K[G] * T[R], u[R] = K[G] * T[b] - K[b] * T[G];
						for(var h = 0; 3 > h; h++) S[3 * (E + h) + G] = u[G], S[3 * (E + h) + b] = u[b], S[3 * (E + h) + R] = u[R]
					}
				for(E = 0; V > E; E += 3) {
					var M = [];
					M[G] = S[E + G], M[b] = S[E + b], M[R] = S[E + R];
					var v = n(M[G] * M[G] + M[b] * M[b] + M[R] * M[R]);
					0 === v && (v = Rc), M[G] = M[G] / v, M[b] = M[b] / v, M[R] = M[R] / v, S[E + G] = M[G], S[E + b] = M[b], S[E + R] = M[R]
				}
				return new Km(S)
			},
			Lk = function(b, m, O, u) {
				if(O || (O = b.createTexture()), m) {
					var f = b.TEXTURE_2D,
						K = b.REPEAT,
						H = b.CLAMP_TO_EDGE,
						r = b.TEXTURE_MIN_FILTER;
					u !== b.NEAREST && (u = b.LINEAR), yj(b, O), b.texImage2D(f, 0, b.RGBA, b.RGBA, b.UNSIGNED_BYTE, m), pj(b, b.TEXTURE_MAG_FILTER, u), vc(m.width) && vc(m.height) && !m.clampToEdge ? (pj(b, b.TEXTURE_WRAP_S, K), pj(b, b.TEXTURE_WRAP_T, K), pj(b, r, b.LINEAR_MIPMAP_LINEAR), b.generateMipmap(f)) : (pj(b, b.TEXTURE_WRAP_S, H), pj(b, b.TEXTURE_WRAP_T, H), pj(b, r, u)), yj(b, _)
				}
				return O
			},
			gb = function(d, J) {
				var S = new Uint8Array(3);
				return J = J || d.createTexture(), yj(d, J), pj(d, d.TEXTURE_MIN_FILTER, d.LINEAR), d.texImage2D(d.TEXTURE_2D, 0, d.RGB, 1, 1, 0, d.RGB, d.UNSIGNED_BYTE, S), J
			},
			ri = function(B) {
				B._26I && B._prg && (B._26I.deleteProgram(B._prg), B._prg = _)
			},
			si = function(w, Y, y, z) {
				var t = w.createShader(y);
				return w.shaderSource(t, z), w.compileShader(t), w.attachShader(Y, t), t
			},
			Tl = function(r) {
				return r.createBuffer()
			},
			yj = function(c, A) {
				c.bindTexture(c.TEXTURE_2D, A)
			},
			ai = function(y, b) {
				y.bindFramebuffer(y.FRAMEBUFFER, b)
			},
			pj = function(m, z, U) {
				m.texParameteri(m.TEXTURE_2D, z, U)
			},
			qq = function(i, j) {
				if(j) {
					var j = Qq(j);
					i.clearColor(j[0], j[1], j[2], j[3])
				}
			},
			Zp = function(D, F) {
				Me(D, F.uFix, !0), pn(D, F.aNormal)
			},
			sj = function(V, f) {
				Me(V, f.uFix, !1), fm(V, f.aNormal)
			},
			dq = function(n, m, x, Z, B, F, f, u) {
				n._picking || (x ? (Me(n, m.uBlend, !0), Me(n, m.uBlendColor, x)) : Me(n, m.uBlend, !1), Me(n, m.uLight, Z == _ ? !0 : Z), jb(B) && 1 !== B && Me(n, m.uPartOpacity, B), Me(n, m.uReverseFlip, F == _ ? !1 : F), Me(n, m.uFixPickReverseColor, f || nj)), u ? n.enable(n.CULL_FACE) : n.disable(n.CULL_FACE)
			},
			md = function(H, J) {
				H._picking || Me(H, J.uPartOpacity, 1)
			},
			Em = function(l, X, A, a, _, e, r, F, o) {
				if(!A) return l.activeTexture(l.TEXTURE0), yj(l, l._emptyTexture), l.activeTexture(l.TEXTURE1), yj(l, l._emptyBlendTexture), void 0;
				Me(l, X.uTexture, !0), Me(l, X.uDiscardSelectable, Yh(a) ? a : !0), fm(l, X.aUv), vg(l, _, e, X.aUv, 2), o ? (Me(l, X.uBlendTexture, !0), l.activeTexture(l.TEXTURE1), yj(l, o), l.uniform1i(X.uBlendSampler, 1)) : (Me(l, X.uBlendTexture, !1), l.activeTexture(l.TEXTURE1), yj(l, l._emptyBlendTexture)), l.activeTexture(l.TEXTURE0), yj(l, A), l.uniform1i(X.uSampler, 0);
				var V = [0, 0, 1, 1];
				r && (V[0] = r[0], V[1] = r[1]), F && (V[2] = F[0], V[3] = F[1]), Me(l, X.uOffsetScale, V)
			},
			Tp = function(f, n, P) {
				f.activeTexture(f.TEXTURE0), yj(f, _), f.activeTexture(f.TEXTURE1), yj(f, _), P && (pn(f, n.aUv), Me(f, n.uTexture, !1), Me(f, n.uBlendTexture, !1))
			},
			Ib = function(A, j, C, W, F, p) {
				!C || P || $ || A.lineWidth(C), W && !A._picking && Me(A, j.uFixPickReverseColor, W), F && vg(A, F, p, j.aPosition)
			},
			Zf = function(A, y, L, k) {
				xg && (k = A[xg]), A.drawArrays(k == _ ? A.TRIANGLES : k, y, L);
				var a = A._renderInfo;
				a && (a.calls++, a.vertices += L, (k == _ || k === A.TRIANGLES) && (a.faces += L / 3), k === A.LINES && (a.lines += L / 2))
			},
			zc = function(R, z, Y, g) {
				xg && (g = R[xg]), R.drawElements(g == _ ? R.TRIANGLES : g, Y, R.UNSIGNED_SHORT, z == _ ? 0 : 2 * z);
				var U = R._renderInfo;
				U && (U.calls++, U.vertices += Y, (g == _ || g === R.TRIANGLES) && (U.faces += Y / 3), g === R.LINES && (U.lines += Y / 2))
			},
			og = function(G, U, q, O, o) {
				var W = G.ARRAY_BUFFER;
				G.bindBuffer(W, U), q && G.bufferData(W, q, G.STATIC_DRAW), O != _ && G.vertexAttribPointer(O, o ? o : 3, G.FLOAT, !1, 0, 0)
			},
			vg = function(F, o, d, J, i) {
				return d ? (eh(F, F.ARRAY_BUFFER, o, d), J != _ && F.vertexAttribPointer(J, i ? i : 3, F.FLOAT, !1, 0, 0), void 0) : og(F, o, d, J, i)
			},
			Ap = function(P, O, a) {
				var s = P.ELEMENT_ARRAY_BUFFER;
				P.bindBuffer(s, O), a && P.bufferData(s, a, P.STATIC_DRAW)
			},
			sk = function(z, P, b) {
				eh(z, z.ELEMENT_ARRAY_BUFFER, P, b)
			},
			eh = function(i, f, c, j) {
				var c, d = j.glBuf,
					q = i._id;
				d && (c = d[q]) && c._buf ? i.bindBuffer(f, c._buf) : (c = {
					_buf: Tl(i)
				}, i._bufPool.push(c), i.bindBuffer(f, c._buf), i.bufferData(f, j, i.STATIC_DRAW), d || (d = j.glBuf = {}), d[q] = c), c._fid = i._renderInfo.frame
			},
			Me = function(m, e, A) {
				if(A != _ && e != _) {
					A = Qq(A);
					var t = A.length;
					3 === t ? m.uniform3fv(e, A) : 4 === t ? m.uniform4fv(e, A) : 16 === t ? m.uniformMatrix4fv(e, !1, A) : Yh(A) ? m.uniform1i(e, A ? 1 : 0) : 2 === t ? m.uniform2fv(e, A) : m.uniform1f(e, A)
				}
			},
			fm = function(r, k) {
				k != _ && k >= 0 && r.enableVertexAttribArray(k)
			},
			pn = function(N, W) {
				W != _ && W >= 0 && N.disableVertexAttribArray(W)
			},
			Qk = function(p, n) {
				var K = p.getGL(),
					F = p._prg;
				p._7O = p._8O.pop(), n && (Me(K, F.uMVMatrix, p._7O), p._6O = n, Me(K, F.uNMatrix, n))
			},
			Hi = function(A, L) {
				return L || (L = Wh()), Gm(L, A), Gn(L), Xj(L), L
			},
			Jd = function(W, N) {
				var S = W.getGL(),
					i = W._prg,
					R = W._7O;
				N && (W._8O.push(Nh(R)), Zl(R, R, N)), Me(S, i.uMVMatrix, R), Me(S, i.uNMatrix, Hi(R, W._6O))
			},
			yb = function(l, y, v, b, _, j) {
				if(v) {
					if(b) {
						var e = v.value++,
							m = 2147483648 | e,
							f = [(255 & m >> 16) / 255, (255 & m >> 8) / 255, (255 & m) / 255, (255 & m >> 24) / 255];
						v[e] = {
							data: _,
							part: j
						}
					} else f = Kg;
					return Me(l, y.uFixPickReverseColor, f), f
				}
			},
			Iq = function() {
				var C = {
					center: function(T, h, r, k, R) {
						var t = -h[1] / 2,
							c = {
								x: -h[0] / 2,
								y: t,
								width: h[0],
								height: h[1]
							},
							S = Uc(T, c, r);
						return [S.x + k, -S.y - R, Lq()]
					},
					front: function(p, O, t, e, G) {
						var C = -O[1] / 2,
							J = {
								x: -O[0] / 2,
								y: C,
								width: O[0],
								height: O[1]
							},
							V = Uc(p, J, t);
						return [V.x + e, -V.y - G, O[2] / 2 + Lq()]
					},
					back: function(W, J, K, u, L) {
						var G = -J[0] / 2,
							t = -J[1] / 2,
							$ = {
								x: G,
								y: t,
								width: J[0],
								height: J[1]
							},
							T = Uc(W, $, K);
						return [-T.x - u, -T.y - L, -J[2] / 2 - Lq()]
					},
					left: function(A, m, T, E, $) {
						var f = -m[1] / 2,
							k = {
								x: -m[2] / 2,
								y: f,
								width: m[2],
								height: m[1]
							},
							g = Uc(A, k, T);
						return [-m[0] / 2 - Lq(), -g.y - $, g.x + E]
					},
					right: function(X, p, c, I, E) {
						var i = -p[2] / 2,
							F = -p[1] / 2,
							x = {
								x: i,
								y: F,
								width: p[2],
								height: p[1]
							},
							n = Uc(X, x, c);
						return [p[0] / 2 + Lq(), -n.y - E, -n.x - I]
					},
					top: function(v, C, G, D, X) {
						var o = {
								x: -C[0] / 2,
								y: -C[2] / 2,
								width: C[0],
								height: C[2]
							},
							g = Uc(v, o, G);
						return [g.x + D, C[1] / 2 + Lq(), g.y + X]
					},
					bottom: function(v, _, k, H, G) {
						var J = -_[2] / 2,
							m = {
								x: -_[0] / 2,
								y: J,
								width: _[0],
								height: _[2]
							},
							l = Uc(v, m, k);
						return [l.x + H, -_[1] / 2 - Lq(), -l.y - G]
					}
				};
				return function(t, J, F, j, o, k) {
					return C[j](t, J, F, o || 0, k || 0)
				}
			}(),
			Oq = function(g, c, m, z, a, O, p, I, X, H) {
				if(a && (c[0] += a[0], c[1] += a[1], c[2] += a[2]), lg(g, m), I) {
					var e = Wh();
					if(Dl(e, X, H), ph(c, e), lg(g, c), g.auto = I, g.pos = ph([0, 0, 0], g), O) {
						var t = g.mat2 = Wh();
						Dl(t, O, p)
					}
				} else Dl(g, X, H), lg(g, c), z === vr ? Rr(g, -o) : z === Td ? Rr(g, o) : z === Pi ? Yk(g, -o) : z === ed ? Yk(g, o) : z === Cp && Rr(g, V), Dl(g, O, p);
				return g
			},
			Pc = function(P, z) {
				var p = z.auto,
					F = z.mat2,
					n = P.gv;
				if(p) {
					var d, y = Wh(),
						x = [0, 0, 0, 0];
					d = "string" == typeof p ? [p.indexOf("x") < 0 ? n._eye[0] : n._center[0], p.indexOf("y") < 0 ? n._eye[1] : n._center[1], p.indexOf("z") < 0 ? n._eye[2] : n._center[2]] : n._eye, jj(x, gf(Wh(), d, n._center, n._up)), op(y, _j(x, x), z.pos), F && Zl(y, y, F), Jd(n, y)
				} else Jd(n, z)
			},
			$d = function(y, q, K, X, I) {
				var O = y.s,
					f = y.gv,
					n = f.getGL(),
					Z = f._prg,
					_ = f._buffer,
					C = f._1O;
				Lk(n, Zm, C), Pc(y, K), dq(n, Z, O(q + ".blend"), O(q + ".light"), O(q + ".opacity"), O(q + ".reverse.flip"), O(q + ".reverse.color"), O(q + ".reverse.cull")), Em(n, Z, C, I, _.uv, qm), vg(n, _.vs, X, Z.aPosition), vg(n, _.ns, zi, Z.aNormal), sk(n, _.is, Qr), zc(n, 0, Qr.length), Tp(n, Z, C), md(n, Z), Qk(f)
			},
			Ag = function(x, r, l) {
				var z = x.gv,
					v = x.data,
					s = x[r] = {
						blend: z.getBodyColor(v) || z.getFaceBlend(v, r),
						light: z.getFaceLight(v, r),
						color: z.getFaceColor(v, r),
						opacity: z.getFaceOpacity(v, r),
						transparent: z.getFaceTransparent(v, r),
						reverseFlip: z.getFaceReverseFlip(v, r),
						reverseColor: z.getFaceReverseColor(v, r),
						reverseCull: z.getFaceReverseCull(v, r),
						texture: z.getFaceImage(v, r),
						blendTexture: z.getFaceBlendImage(v, r),
						discardSelectable: z.getFaceDiscardSelectable(v, r)
					};
				if("csg" !== r) {
					s.uv = z.getFaceUv(v, r) || l && l[r + "Uv"], s.uvScale = z.getFaceUvScale(v, r) || l && l[r + "UvScale"], s.uvOffset = z.getFaceUvOffset(v, r) || l && l[r + "UvOffset"];
					var n = z.getFaceMat(v, r);
					n && (s.mat = el(v, n))
				}
				return s
			},
			Rb = function(h, V, W, r, l) {
				if(r) {
					if(!l(r.transparent)) return;
					var Y = h.data,
						O = h.gv,
						A = O._buffer,
						t = O.getTexture(r.texture, Y),
						_ = O.getTexture(r.blendTexture, Y);
					Em(V, W, t, r.discardSelectable, A.uv, r.tuv, r.uvOffset, r.uvScale, _), dq(V, W, r.blend, r.light, r.opacity, r.reverseFlip, r.reverseColor, r.reverseCull), Me(V, W.uDiffuse, r.color), vg(V, A.vs, r.vs, W.aPosition), vg(V, A.ns, r.ns, W.aNormal), Zf(V, 0, r.vs.length / 3), md(V, W), Tp(V, W, t)
				}
			},
			Le = function(S, W, O, y, C, c) {
				var X, q, p, P, Z, Y, m, i, t, D, k, x = [y - W, C - O],
					R = S ? S.length : 0;
				for(p = 0; R > p; p++) {
					for(P = 2, X = S[p], Z = X[0], Y = X[1]; P + 1 < X.length;) {
						if(m = X[P], i = X[P + 1], q = Kf(W, O, y, C, Z, Y, m, i, !0)) {
							t = [m - Z, i - Y], D = uh(t), t[0] /= D, t[1] /= D, D = Yg(x, t), D = D > 0 ? c : -c, k = [t[0] * D, t[1] * D];
							break
						}
						Z = m, Y = i, P += 2
					}
					if(k) break
				}
				if(k)
					for(y = W + k[0], C = O + k[1], p = 0; R > p; p++)
						for(P = 2, X = S[p], Z = X[0], Y = X[1]; P + 1 < X.length;) {
							if(m = X[P], i = X[P + 1], q = Kf(W, O, y, C, Z, Y, m, i, !0)) return [0, 0];
							Z = m, Y = i, P += 2
						}
				return k ? k : [y - W, C - O]
			},
			qe = z.graph3d = {},
			ch = function(K, s, B) {
				xh(m + ".graph3d." + K, s, B)
			},
			dj = "~<yfusfw!+!yjsubNQv!>!opjujtpQ`mh!gjeof$!~<fdobutjEfojMb!>!fdobutjEfojMw|*itbEv)gj!ITBE!gfegj$!!gjeof$!~<ttfouihjsCidubCb!>!ttfouihjsCidubCw|*ttfouihjsCidubCv)gj!TTFOUIHJSCIDUBC!gfegj$!!gjeof$!~<eofmCidubCb!>!eofmCidubCw|*eofmCidubCv)gj!EOFMCIDUBC!gfegj$!!gjeof$!~<spmpDidubCb!>!spmpDidubCw|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!~<wVb!>!wVs|*fsvuyfUeofmCv)gj~<x{/fmbdTuftggPv!+!wVb!,!zy/fmbdTuftggPv!>!wVw|*fsvuyfUv)gj~<*yfusfw)4dfw!>!yfusfWw<**1/2!-mbnspOb)5dfw!+!yjsubNOv)4dfw!>!mbnspOw|*ldjQva!%%!yjGva)gj<*1/2!-opjujtpQb)5dfw!+!yjsubNWNv!>!yfusfw!5dfw|!*ejpw)ojbn!ejpw!gjeof$!<fdobutjEfojMw!ubpmg!hojzsbw<fdobutjEfojMb!ubpmg!fuvcjsuub<itbEv!mppc!nspgjov!ITBE!gfegj$!!gjeof$!<^UPQT`YBN]opjudfsjEupqTv!4dfw!nspgjov<^UPQT`YBN]opjujtpQupqTv!4dfw!nspgjov<^UPQT`YBN]spmpDupqTv!5dfw!nspgjov!1!?!UPQT`YBN!gj$!!gjeof$!<^UOJPQ`YBN]opjujtpQuojpQv!4dfw!nspgjov<^UOJPQ`YBN]spmpDuojpQv!5dfw!nspgjov!1!?!UOJPQ`YBN!gj$!!gjeof$!<^SJE`YBN]opjudfsjEsjEv!4dfw!nspgjov<^SJE`YBN]spmpDsjEv!5dfw!nspgjov!1!?!SJE`YBN!gj$!!gjeof$!<eofmCidubCw!4dfw!hojzsbw<eofmCidubCb!4dfw!fuvcjsuub<eofmCidubCv!mppc!nspgjov!EOFMCIDUBC!gfegj$!!gjeof$!<ttfouihjsCidubCw!ubpmg!hojzsbw<ttfouihjsCidubCb!ubpmg!fuvcjsuub<ttfouihjsCidubCv!mppc!nspgjov!TTFOUIHJSCIDUBC!gfegj$!!gjeof$!<spmpDidubCw!5dfw!hojzsbw<spmpDidubCb!5dfw!fuvcjsuub<spmpDidubCv!mppc!nspgjov!SPMPDIDUBC!gfegj$!<yfusfWw!4dfw!hojzsbw<mbnspOw!4dfw!hojzsbw<yjGv!mppc!nspgjov<ldjQv!mppc!nspgjov<yjsubNxfjWv!5ubn!nspgjov<yjsubNOv!5ubn!nspgjov<yjsubNQv!5ubn!nspgjov<yjsubNWNv!5ubn!nspgjov<opjujtpQb!4dfw!fuvcjsuub<mbnspOb!4dfw!fuvcjsuub<wVs!3dfw!hojzsbw<wVw!3dfw!hojzsbw<wVb!3dfw!fuvcjsuub<fmbdTuftggPv!5dfw!nspgjov<fsvuyfUeofmCv!mppc!nspgjov<fsvuyfUv!mppc!nspgjov!YJGFSQ^#CBRBEJxTT87hJFI,,bX1XrIwcn3UM{ZeZ,M6HEN6nLxe2Z72s2:3johr6foKrpqwxNKYkdbJ2CN[mBbf[wXU,T0oGuSEd190ohLZkEn8IuCe[OHoWeKz:Sf,VS7xdSLw23W1YJLU:jdv2{hiDbhDzNNEh9tp3xsuEp94Sl4c3wRzqwShMDRhCLRjCDEBOH5BBVRBCFRE4cJTHrTDH1BNgHJN",
			ni = "~~<eJ!>!spmpDhbsG`mh~<spmpDsfmqnbTwv!>+!eJ<*wVs!-sfmqnbTeofmCv)E3fsvuyfu!>!spmpDsfmqnbTwv!5dfw|!*fsvuyfUeofmCv)!gj!!gjeof$!~<ttfouihjsCidubCw!>+!chs/eJ!!!|*ttfouihjsCidubCv)gj!TTFOUIHJSCIDUBC!gfegj$!~<ttfouihjsCv!>+!chs/eJ!!!|*1/2!>a!ttfouihjsCv)gj~~<zujdbqPusbQv!>+!b/eJ!!!|*1/2!>a!zujdbqPusbQv)gj~!gjeof$!<*spudbGhpg!-*x/eJ!-chs/spmpDhpGv)5dfw!-eJ)yjn!>!eJ<*iuqfe!-sbGhpGv!-sbfOhpGv)qfutiuppnt!>!spudbGhpg!ubpmg<x/esppDhbsG`mh0{/esppDhbsG`mh!>!iuqfe!ubpmg!HPG!gfegj$!!gjeof$!~~~~<chs/^j]spmpDupqTv!+!udfggFupqt!+!fhobSm!+!*1/1!-*mbnspOm.!-O)upe)ybn!>,!chs/eJ<*1/1!-*^j]uofopqyFupqTv!-udfggFupqt)xpq)ybn!>!udfggFupqt|*^j]fmhoBupqTv!?!udfggFupqt)gj<*mbnspOm!-^j]opjudfsjEupqTv)upe!>!udfggFupqt!ubpmg<*spudfWm)f{jmbnspo!>!mbnspOm!4dfw|*1/1!?!fhobSm)!gj~<*1/2!-*^j]fhobSupqTv!0!*spudfWm)iuhofm))ojn!.!1/2!>!fhobSm|*1/1!?!^j]fhobSupqTv)!gj<1/2!>!fhobSm!ubpmg<^j]opjujtpQupqTv!.!yfusfWw!>!spudfWm!4dfw|*1/1!>>!x/^j]spmpDupqTv)gj|!*,,j!<UPQT`YBN!=!j!<1>j!uoj)spg!1!?!UPQT`YBN!gj$!!gjeof$!~~~<chs/^j]spmpDuojpQv!+!fhobSm!+!*1/1!-**spudfWm)f{jmbnspo.!-O)upe)ybn!>,!chs/eJ|*1/1!?!fhobSm)!gj~<*1/2!-*^j]fhobSuojpQv!0!*spudfWm)iuhofm))ojn!.!1/2!>!fhobSm|*1/1!?!^j]fhobSuojpQv)!gj<1/2!>!fhobSm!ubpmg<^j]opjujtpQuojpQv!.!yfusfWw!>!spudfWm!4dfw|*1/1!>>!x/^j]spmpDuojpQv)gj|!*,,j!<UOJPQ`YBN!=!j!<1>j!uoj)spg!1!?!UOJPQ`YBN!gj$!!gjeof$!~~<chs/^j]spmpDsjEv!+!*1/1!-**^j]opjudfsjEsjEv)f{jmbnspo.!-O)upe)ybn!>,!chs/eJ|*1/1!>>!x/^j]spmpDsjEv)gj|!*,,j!<SJE`YBN!=!j!<1>j!uoj)spg!1!?!SJE`YBN!gj$!~<chs/spmpDuihjmebfIv!+!nsfUusfcnbm!>+!chs/eJ~<*1/2!-fhobSuihjmebfIv0*yfusfWw)iuhofm)ojn!.!1/2!!>+!nsfUusfcnbm|*1/1!?!fhobSuihjmebfIv)gj<*1/1!-6/1!,!6/1!+!*M.!-O)upe)ybn!>!nsfUusfcnbm!ubpmg|*1/1!>>!x/spmpDuihjmebfIv)gj|*uihjMv)gj~!gjeof$!~<spmpDeofmCv!>+!eJ|*eofmCv)gj!ftmf$!~<spmpDeofmCv!>+!eJ|*eofmCv)gj!ftmf~<eofmCidubCw!>+!chs/eJ|*eofmCidubCv)gj!EOFMCIDUBC!gfegj$!~<spmpd!>!eJ|ftmf~<spmpDwv!>!eJ|*fsvuyfUv)gj|!ftmf~<spmpDftsfwfSldjQyjGv!>!eJ|*qjmGftsfwfSva!%%!ldbCtj)gj~<fvsu!>!ldbCtj<O.!>!O|*1/1!=!*O!-F)upe)gj<ftmbg!>!ldbCtj!mppc<F.!>!M!4dfw<*yfusfWw.)f{jmbnspo!>!F!4dfw<*mbnspOw)f{jmbnspo!>!O!4dfw!gjeof$!<ftvggjEv!>!spmpd!ftmf$!~<ftvggjEv!>!spmpd|ftmf~<spmpDidubCw!>!spmpd|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!<spmpd!5dfw|!ftmf~!gjeof$!~~<ftvggjEv!>!eJ|ftmf~<esbdtje|*1/1!>>!x/ftvggjEv)gj|!*!fdobutjEitbEv!?!*!fdobutjEqbHitbEv!-fdobutjEfojMw!)epn!%%!itbEv)!gj!ITBE!gfegj$!!gjeof$!<spmpDftsfwfSldjQyjGv!>!eJ!ftmf$!~<spmpDftsfwfSldjQyjGv!>!eJ|ftmf~<spmpDidubCw!>!eJ|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!|*yjGv)gj<eJ!5dfw|ftmf~~!<esbdtje!|!*1/1!>>!b/spmpDhbsG`mh)!gj!gjeof$!<spmpDftsfwfSldjQyjGv!>!spmpDhbsG`mh!ftmf$!~<spmpDftsfwfSldjQyjGv!>!spmpDhbsG`mh|ftmf~<spmpDidubCw!>!spmpDhbsG`mh|*spmpDidubCv)gj!SPMPDIDUBC!gfegj$!|*ldjQv)gj~~~!<esbdtje!|!*utfUbiqmBv!>=!b/spmpDwv)!gj!!!!|!ftmf~~!<esbdtje!|!*1/1!>>!b/spmpDwv)!gj!!!!|!*uofsbqtobsUv)!gj<*wVw!-sfmqnbTv)E3fsvuyfu!>!spmpDwv|**fmcbudfmfTesbdtjEv!%%!ldjQv)a!%%!fsvuyfUv)gj<spmpDwv!5dfw|!*ejpw)ojbn!ejpw!gjeof$!<fdobutjEfojMw!ubpmg!hojzsbw<fdobutjEqbHitbEv!ubpmg!nspgjov<fdobutjEitbEv!ubpmg!nspgjov<itbEv!mppc!nspgjov!ITBE!gfegj$!!gjeof$!<sbGhpGv!ubpmg!nspgjov<sbfOhpGv!ubpmg!nspgjov<spmpDhpGv!5dfw!nspgjov!HPG!gfegj$!!gjeof$!<^UPQT`YBN]opjudfsjEupqTv!4dfw!nspgjov<^UPQT`YBN]opjujtpQupqTv!4dfw!nspgjov<^UPQT`YBN]fhobSupqTv!ubpmg!nspgjov<^UPQT`YBN]fmhoBupqTv!ubpmg!nspgjov<^UPQT`YBN]uofopqyFupqTv!ubpmg!nspgjov<^UPQT`YBN]spmpDupqTv!5dfw!nspgjov!1!?!UPQT`YBN!gj$!!gjeof$!<^UOJPQ`YBN]opjujtpQuojpQv!4dfw!nspgjov<^UOJPQ`YBN]fhobSuojpQv!ubpmg!nspgjov<^UOJPQ`YBN]spmpDuojpQv!5dfw!nspgjov!1!?!UOJPQ`YBN!gj$!!gjeof$!<^SJE`YBN]opjudfsjEsjEv!4dfw!nspgjov<^SJE`YBN]spmpDsjEv!5dfw!nspgjov!1!?!SJE`YBN!gj$!!gjeof$!<eofmCidubCw!4dfw!hojzsbw<eofmCidubCv!mppc!nspgjov!EOFMCIDUBC!gfegj$!!gjeof$!<ttfouihjsCidubCw!ubpmg!hojzsbw<ttfouihjsCidubCv!mppc!nspgjov!TTFOUIHJSCIDUBC!gfegj$!!gjeof$!<spmpDidubCw!5dfw!hojzsbw<spmpDidubCv!mppc!nspgjov!SPMPDIDUBC!gfegj$!<spmpDuihjmebfIv!5dfw!nspgjov<fhobSuihjmebfIv!ubpmg!nspgjov<yfusfWw!4dfw!hojzsbw<mbnspOw!4dfw!hojzsbw<ftvggjEv!5dfw!nspgjov<zujdbqPusbQv!ubpmg!nspgjov<ttfouihjsCv!ubpmg!nspgjov<uihjMv!mppc!nspgjov<spmpDeofmCv!5dfw!nspgjov<eofmCv!mppc!nspgjov<wVs!3dfw!hojzsbw<sfmqnbTeofmCv!E3sfmqnbt!nspgjov<sfmqnbTv!E3sfmqnbt!nspgjov<wVw!3dfw!hojzsbw<fsvuyfUeofmCv!mppc!nspgjov<fsvuyfUv!mppc!nspgjov<uofsbqtobsUv!mppc!nspgjov<utfUbiqmBv!ubpmg!nspgjov<spmpDftsfwfSldjQyjGv!5dfw!nspgjov<qjmGftsfwfSv!mppc!nspgjov<ldjQv!mppc!nspgjov<yjGv!mppc!nspgjov<fmcbudfmfTesbdtjEv!mppc!nspgjov!YJGFSQ!gjeof$!!gjeof$!!<ubpmg!qnvjefn!opjtjdfsq!!ftmf$!!<ubpmg!qihji!opjtjdfsq!!IHJI`OPJTJDFSQ`UOFNHBSG`MH!gfegj$!!TF`MH!gfegj$!";
		yi(h, {
			setBatchInfo: function(q, a) {
				En[q] = a
			},
			getBatchInfo: function(Q) {
				return En[Q]
			}
		}, !0);
		var kd = [1, 1, 1],
			br = [1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0],
			zk = [-.5, .5, .5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, .5, .5],
			ts = [.5, .5, -.5, .5, .5, .5, .5, -.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, .5, -.5],
			Lf = [.5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, .5, .5, -.5],
			Jp = [.5, -.5, .5, -.5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, .5],
			Vq = [.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5],
			Cc = [-.5, .5, -.5, .5, .5, -.5, .5, -.5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5],
			zn = function(r, R) {
				Sq(r, R, "_batchModelMap", "_batchIndexMap"), Ld(r, R, "_wireframeModelMap", "_wireframeIndexMap"), Ld(r, R, "_polylineModelMap", "_polylineIndexMap"), Ld(r, R, "_wireframeModelMapSwap", "_wireframeIndexMapSwap"), Ld(r, R, "_polylineModelMapSwap", "_polylineIndexMapSwap")
			},
			Sq = function(c, j, N, m) {
				if(!j) return c[N] = {}, c[m] = {}, void 0;
				var D = j._id,
					G = c[m],
					k = G[D];
				if(k) {
					var t = c[N],
						W = k.batch,
						i = t[W],
						S = i.ds,
						q = k.index;
					if(i.invalidate = !0, delete G[D], S.splice(q, 1), Zk(S)) return delete t[W], void 0;
					for(var C = k.begin, U = k.size, g = 3 * C, O = 3 * U, z = 4 * C, F = 4 * U, b = i.vs, A = i.ps, l = i.uv, K = i.cs, x = i.bs, I = i.rs, e = i.ns, p = i.ls; q < S.length; q++) k = G[S[q]._id], k.index--, k.begin -= U;
					b.splice(g, O), A.splice(z, F), l && l.splice(2 * C, 2 * U), K && K.splice(z, F), x && x.splice(g, O), I && I.splice(C, U), e && e.splice(g, O), p && p.splice(C, U)
				}
			},
			Ld = Sq,
			kf = function(Q, H, X, k) {
				if(!k) return _;
				var l = H[k];
				if(!l) {
					var n = En[k] || ng,
						c = n.image ? [] : _;
					l = H[k] = {
						vs: [],
						ns: [],
						uv: c,
						cs: c ? _ : n.color ? _ : [],
						bs: n.blend ? [] : _,
						ps: [],
						rs: n.brightness ? [] : _,
						ds: []
					}
				}
				return l.invalidate = !0, Q[X._id] = {
					index: l.ds.length,
					begin: l.vs.length / 3,
					batch: k
				}, l.ds.push(X), l
			},
			xb = function(E, P) {
				return P != _ && 1 !== P ? [E[0] * P, E[1] * P, E[2] * P, E[3]] : E
			},
			sc = function(h, Y, l) {
				var R = h.getBrightness(Y),
					v = Qq(l.color || "white"),
					y = v[3] < 1,
					M = Math.ceil(l.width) || 1,
					o = (y ? "T" : "O") + M,
					p = h._wireframeIndexMap,
					Z = h._wireframeModelMap,
					e = Z[o];
				e || (e = Z[o] = {
					vs: [],
					cs: [],
					ps: [],
					ds: [],
					T: y,
					W: M
				});
				var j, T = h.getData3dUI(Y),
					P = Qg(T);
				if(l.geometry) {
					if(!P) return;
					if(j = hj(P), !j) return
				} else j = l.short ? lp : If;
				e.invalidate = !0;
				var I = e.vs,
					B = e.cs,
					m = e.ds,
					d = p[Y._id] = {
						index: m.length,
						begin: I.length / 3,
						batch: o
					};
				m.push(Y);
				var n = el(Y, l.mat),
					Q = T._calcAnchorMat(Y);
				Q && Zl(n, n, Q), cg(I, n, j);
				var $ = d.size = I.length / 3 - d.begin;
				Af(B, xb(v, R), $)
			},
			Um = function(p, K, c, N, X, v, B, n, J) {
				var g = p.getBrightness(K);
				g == _ && (g = 1);
				var b = xb(Qq(N), g),
					l = b[3] < 1;
				v = Math.ceil(v) || 1;
				var y = (l ? "T" : "O") + v;
				if(B) {
					var a = B[0],
						x = (B[1] || a) + a;
					y += "-" + a + "-" + x, J && (y += "-" + Hl(J) + "-" + g, J = xb(Qq(J), g))
				}
				var E = p._polylineIndexMap,
					j = p._polylineModelMap,
					P = j[y];
				P || (P = j[y] = {
					vs: [],
					cs: [],
					ps: [],
					ds: [],
					ls: B ? [] : _,
					T: l,
					W: v
				}, B && (P.D = a, P.G = x, P.A = J)), P.invalidate = !0;
				var U, k = P.vs,
					C = P.cs,
					o = P.ds,
					G = P.ls,
					r = E[K._id] = {
						index: o.length,
						begin: k.length / 3,
						batch: y
					};
				o.push(K), Fo(k, c);
				var R, T = r.size = k.length / 3 - r.begin,
					V = c.length,
					z = 0,
					W = [];
				if(B || X)
					for(U = 0; V > U; U += 6) R = uh([c[U], c[U + 1], c[U + 2]], [c[U + 3], c[U + 4], c[U + 5]]), W.push(R), z += R;
				if(z && X) {
					var h, M = xb(Qq(X), g),
						t = [M[0] - b[0], M[1] - b[1], M[2] - b[2], M[3] - b[3]],
						s = 0;
					for(U = 0; V > U; U += 6) h = s / z, Af(C, [b[0] + t[0] * h, b[1] + t[1] * h, b[2] + t[2] * h, b[3] + t[3] * h], 1), s += W[U / 6], h = s / z, Af(C, [b[0] + t[0] * h, b[1] + t[1] * h, b[2] + t[2] * h, b[3] + t[3] * h], 1)
				} else Af(C, b, T);
				if(B)
					for(s = n || 0, U = 0; V > U; U += 6) G.push(s), s += W[U / 6], G.push(s)
			},
			Hh = function(f, X, r) {
				if(X)
					for(var d = 4 * X.begin, e = r[X.batch].ps, R = 0; R < X.size; R++) e[d++] = f[0], e[d++] = f[1], e[d++] = f[2], e[d++] = f[3]
			},
			ge = function(J, v) {
				var c = v + ["32"],
					w = J[v],
					B = J[c];
				w ? B && B.length === w.length ? (B.set(w), B.glBuf = null) : J[c] = new Km(w) : delete J[c]
			},
			Gh = function(B, y, M, r, V, n, o, x, T) {
				if(An(M)) M.forEach(function(Q) {
					Gh(B, y, Q, r, V, n, o, x, T)
				});
				else if(Ol(M)) Gh(B, y, Qg(r, M), r, V, n, o, x, T);
				else if(Ki(M)) {
					var w, C = Vo(M.mat, y, B),
						A = Vo(M.s3, y, B),
						I = Vo(M.t3, y, B),
						_ = Vo(M.r3, y, B);
					if((A || _ || I || C) && (w = Uj(C, A, _, Vo(M.rotationMode, y, B), I), n.push(w)), M.shape3d) Gh(B, y, M.shape3d, r, V, n, o, x, M);
					else {
						var p = r.s;
						T = T || ng;
						var f = n[0],
							R = n.length,
							b = p("shape3d.color", M.color, T.color);
						if(V || (V = p("shape3d.blend", M.blend, T.blend)), R > 1) {
							f = Nh(f);
							for(var Z = 1; R > Z; Z++) Zl(f, f, n[Z])
						}
						M.vs && p(Sd, M.visible, T.visible) && eo(f, o, x, M.vs, M.uv, M.is, V, b), M.top_vs && p(nn, M.topVisible, T.topVisible) && eo(f, o, x, M.top_vs, M.top_uv, M.top_is, V, p("shape3d.top.color", M.topColor, T.topColor) || b), M.bottom_vs && p(tb, M.bottomVisible, T.bottomVisible) && eo(f, o, x, M.bottom_vs, M.bottom_uv, M.bottom_is, V, p("shape3d.bottom.color", M.bottomColor, T.bottomColor) || b), M.from_vs && p(Vr, M.fromVisible, T.fromVisible) && eo(f, o, x, M.from_vs, M.from_uv, M.from_is, V, p("shape3d.from.color", M.fromColor, T.fromColor) || b), M.to_vs && p(nb, M.toVisible, T.toVisible) && eo(f, o, x, M.to_vs, M.to_uv, M.to_is, V, p("shape3d.to.color", M.toColor, T.toColor) || b)
					}
					w && n.pop()
				}
			},
			eo = function(s, z, O, F, J, n, A, D) {
				var T, t = z.cs,
					a = z.uv,
					_ = z.bs;
				if(n) {
					T = n.length;
					for(var c = 0; T > c; c++) {
						var Z = n[c];
						cg(O, s, [F[3 * Z], F[3 * Z + 1], F[3 * Z + 2]]), a && Fo(a, [J[2 * Z], J[2 * Z + 1]])
					}
				} else T = F.length / 3, cg(O, s, F), a && Fo(a, J);
				t && Af(t, D, T), _ && (A ? Ul(_, A, T) : Fo(_, kd, T))
			},
			pd = function(Z, e, n, k) {
				var J = [];
				k ? Gh(Z.gv, Z.data, k, Z, Z.getBodyColor(), [e], n, J) : (fp(Z, vr, e, n, J), fp(Z, Td, e, n, J), fp(Z, np, e, n, J), fp(Z, Cp, e, n, J), fp(Z, Pi, e, n, J), fp(Z, ed, e, n, J), fp(Z, "csg", e, n, J)), J.length && (Fo(n.vs, J), Fo(n.ns, ic(J)))
			},
			fp = function(g, F, W, Y, U) {
				var X = g[F];
				if(X) {
					var B = X.tuv;
					if(B) {
						var t, p, u, n, j = X.uvScale,
							a = X.uvOffset;
						if(j)
							for(t = B.length, p = j[0], u = j[1], n = 0; t > n; n += 2) B[n] *= p, B[n + 1] *= u;
						if(a)
							for(t = B.length, p = a[0], u = a[1], n = 0; t > n; n += 2) B[n] += p, B[n + 1] += u
					}
					eo(W, Y, U, X.vs, B, _, X.blend, X.color)
				}
			},
			Cg = function(M, Q, m, Y, e, $, d, P) {
				var y, I = m.cs,
					S = m.uv,
					O = m.bs;
				if(M.getFaceVisible(Q, $)) {
					var l = M.getFaceMat(Q, $);
					if(l && (e = el(Q, l)), cg(d, e, P), I && Af(I, M.getFaceColor(Q, $), 6), S) {
						var K = M.getFaceUv(Q, $) || Y[$ + "Uv"],
							o = M.getFaceUvScale(Q, $) || Y[$ + "UvScale"],
							D = M.getFaceUvOffset(Q, $) || Y[$ + "UvOffset"];
						K = K ? [K[6], K[7], K[0], K[1], K[2], K[3], K[2], K[3], K[4], K[5], K[6], K[7]] : br;
						var s = K[0],
							v = K[1],
							T = K[2],
							J = K[3],
							A = K[4],
							U = K[5],
							b = K[6],
							F = K[7],
							r = K[8],
							H = K[9],
							Z = K[10],
							c = K[11];
						if(o) {
							var C = o[0],
								g = o[1];
							s *= C, v *= g, T *= C, J *= g, A *= C, U *= g, b *= C, F *= g, r *= C, H *= g, Z *= C, c *= g
						}
						if(D) {
							var G = D[0],
								w = D[1];
							s += G, v += w, T += G, J += w, A += G, U += w, b += G, F += w, r += G, H += w, Z += G, c += w
						}
						S.push(s, v, T, J, A, U, b, F, r, H, Z, c)
					}
					O && (y = M.getBodyColor(Q) || M.getFaceBlend(Q, $), y ? Ul(O, y, 6) : Fo(O, kd, 6))
				}
			},
			Lp = function(c, A, G, Y) {
				var q = c.getGL(),
					M = c._prg,
					W = c._buffer;
				if(!Bh(A)) {
					Jd(c), Zp(q, M);
					for(var p in A) {
						var u = A[p];
						if(!(Y && !u.T || !Y && u.T)) {
							u.invalidate ? (u.invalidate = !1, ge(u, "vs"), ge(u, "cs"), ge(u, "ls"), ge(u, "ps")) : G && ge(u, "ps");
							var L = u.vs32,
								T = G ? u.ps32 : u.cs32;
							Ib(q, M, u.W, _, W.vs, L);
							var s = u.D,
								g = !c._dashDisabled && s;
							Me(q, M.uAlphaTest, Q.alphaTest), g && (Me(q, M.uDash, !0), Me(q, M.uDashDistance, s), Me(q, M.uDashGapDistance, u.G), fm(q, M.aLineDistance), vg(q, W.lineDistance, u.ls32, M.aLineDistance, 1), Me(q, M.uDiffuse, u.A || Bf));
							var N = !c._batchColorDisabled;
							N && (Me(q, M.uBatchColor, !0), fm(q, M.aBatchColor), vg(q, W.batchColor, T, M.aBatchColor, 4)), Em(q), Zf(q, 0, L.length / 3, q.LINES), Tp(q), N && (Me(q, M.uBatchColor, !1), pn(q, M.aBatchColor)), g && (Me(q, M.uDash, !1), pn(q, M.aLineDistance))
						}
					}
					sj(q, M)
				}
			},
			zd = function(K, L, I) {
				var R, b, m, G, i, k, Z, j, T, g, d, h = K.getGL(),
					p = K._prg,
					F = K._buffer,
					l = K._batchModelMap;
				if(!Bh(l)) {
					Jd(K);
					for(R in l)
						if(b = En[R] || ng, !(I && !b.transparent || !I && b.transparent) && (m = l[R], L || !b.transparentMask)) {
							var C = I && b.autoSort !== !1 && (K._33Q || m.invalidate);
							if(m.invalidate ? (m.invalidate = !1, ge(m, "vs"), ge(m, "ns"), ge(m, "cs"), ge(m, "rs"), ge(m, "ps"), ge(m, "bs"), ge(m, "uv")) : L && ge(m, "ps"), i = m.vs32, k = L ? m.ps32 : m.cs32, T = m.uv32, Z = m.bs32, j = m.rs32, d = i.length / 3, C && (m.is = Lb(i, K.getEye())), d) {
								G = b.light, g = K.getTexture(b.image), dq(h, p, _, b.light, b.opacity, b.reverseFlip, b.reverseColor, b.reverseCull), k ? K._batchColorDisabled || (Me(h, p.uBatchColor, !0), fm(h, p.aBatchColor), vg(h, F.batchColor, k, p.aBatchColor, 4)) : Me(h, p.uDiffuse, b.color);
								var a = b.alphaTest;
								Me(h, p.uAlphaTest, a === S ? Q.alphaTest : a);
								var w = Z && !K._batchBlendDisabled;
								w && (Me(h, p.uBatchBlend, !0), fm(h, p.aBatchBlend), vg(h, F.batchBlend, Z, p.aBatchBlend));
								var P = j && !K._batchBrightnessDisabled;
								P && (Me(h, p.uBatchBrightness, !0), fm(h, p.aBatchBrightness), vg(h, F.batchBrightness, j, p.aBatchBrightness, 1)), T ? Em(h, p, g, b.discardSelectable, F.uv, T, b.uvOffset, b.uvScale) : Em(h), vg(h, F.vs, i, p.aPosition), vg(h, F.ns, m.ns32, p.aNormal), m.is ? (Ap(h, F.is, m.is), zc(h, 0, d)) : Zf(h, 0, d), T ? Tp(h, p, g) : Tp(h), k && !K._batchColorDisabled && (Me(h, p.uBatchColor, !1), pn(h, p.aBatchColor)), w && (Me(h, p.uBatchBlend, !1), pn(h, p.aBatchBlend)), P && (Me(h, p.uBatchBrightness, !1), pn(h, p.aBatchBrightness)), md(h, p)
							}
						}
				}
			},
			Lb = function(y, o) {
				for(var z = y.length / 3, t = new Array(z), L = z / 3, m = new Array(L), A = 0; L > A; A++) m[A] = A;
				m.sort(function(G, J) {
					var K = 9 * G,
						D = [(y[K] + y[K + 3] + 2 * y[K + 6]) / 4, (y[K + 1] + y[K + 4] + 2 * y[K + 7]) / 4, (y[K + 2] + y[K + 5] + 2 * y[K + 8]) / 4];
					K = 9 * J;
					var r = [(y[K] + y[K + 3] + 2 * y[K + 6]) / 4, (y[K + 1] + y[K + 4] + 2 * y[K + 7]) / 4, (y[K + 2] + y[K + 5] + 2 * y[K + 8]) / 4],
						u = uh(o, D) - uh(o, r);
					return u > 0 ? -1 : 0 > u ? 1 : 0
				});
				for(var A = 0; L > A; A++) {
					var O = 3 * A,
						W = 3 * m[A];
					t[O] = W, t[O + 1] = W + 1, t[O + 2] = W + 2
				}
				return new Fd(t)
			};
		h.handleModelLoaded = function() {}, h.handleUnfoundModel = function() {};
		var Xk = _,
			rh = _,
			xk = function(B) {
				Xk && !B._loadingModelView_ && (rh || (rh = {}), rh[B._loadingModelView_ = zm()] = B)
			},
			mr = function(f, c) {
				Xk || (Xk = {});
				var I = Xk[f];
				if(I) {
					if(I.url === c) return;
					I.request.onload = _k, I.request.onerror = _k
				}
				var B = new XMLHttpRequest;
				if(Xk[f] = {
						request: B,
						url: c
					}, B.overrideMimeType && B.overrideMimeType("text/plain"), c = h.beforeLoadURL(c), c.data) {
					var P = h.parse(c.data);
					Gl(f, P, c)
				} else B.open("GET", encodeURI(c), !0), B.onload = function(Q) {
					if(200 === this.status || 0 === this.status) {
						var R = h.parse(Q.target.response || Q.target.responseText);
						Gl(f, R, c)
					} else rs(f, h.handleUnfoundModel(f, c) || _)
				}, B.onerror = function() {
					rs(f, h.handleUnfoundModel(f, c) || _)
				}, B.send(null)
			},
			Gl = function(z, s, f) {
				var S = s.modelType;
				if(S)
					if("obj" === S) {
						var W = {
							mat: s.mat,
							s3: s.s3,
							r3: s.r3,
							rotationMode: s.rotationMode,
							t3: s.t3,
							cube: s.cube == _ ? !0 : s.cube,
							center: s.center == _ ? !0 : s.center,
							ignoreMtls: s.ignoreMtls,
							ignoreTransparent: s.ignoreTransparent,
							ignoreColor: s.ignoreColor,
							ignoreImage: s.ignoreImage,
							ignoreNormal: s.ignoreNormal,
							prefix: s.prefix,
							flipY: s.flipY,
							flipFace: s.flipFace,
							reverseFlipMtls: s.reverseFlipMtls,
							finishFunc: function(T, M) {
								if(T) {
									var M = [];
									for(var t in T) {
										var J = T[t];
										M.rawS3 = J.rawS3, M.push(J), s.eachModel && s.eachModel(t, J)
									}
									M.json = s, rs(z, M), h.handleModelLoaded(z, M)
								} else rs(z, h.handleUnfoundModel(z, f) || _)
							}
						};
						h.loadObj(s.obj, s.mtl, W)
					} else rs(z, h.handleUnfoundModel(z, f) || _);
				else rs(z, s), h.handleModelLoaded(z, s)
			},
			rs = function($, h) {
				if(pk[$] = h, delete Xk[$], Bh(Xk) && (Xk = _, rh)) {
					for(var p in rh) {
						var C = rh[p];
						C._2O && (C._2O = {}), C.invalidateAll && C.invalidateAll(S, "modelLoaded", $), C.redraw && C.redraw(), C.iv(), delete C._loadingModelView_
					}
					rh = _
				}
				if(h && rh)
					for(var p in rh) {
						var C = rh[p];
						C.invalidateAll && C.invalidateAll(S, "modelLoading", $), C.redraw && C.redraw(), C.iv()
					}
			},
			qm = new Km([0, 0, 0, 1, 1, 1, 1, 0]),
			zi = new Km([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]),
			Qr = new Fd([0, 1, 2, 2, 3, 0]),
			wj = new Km([-.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, .5, .5, .5, -.5, .5, .5, -.5, -.5, .5, .5, -.5, .5, .5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, .5, .5, .5, .5, .5, -.5, -.5, -.5, .5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, .5]),
			js = new Fd([0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23]),
			vo = new Km([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0]),
			Ad = ic(wj, js),
			If = (new Km([-.5, .5, .5, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, -.5, -.5, .5, .5, -.5, -.5, -.5, -.5, -.5, .5, -.5]), new Fd([0, 1, 2, 3, 0, 7, 5, 4, 6, 7, 5, 3, 2, 4, 6, 1]), [-.5, .5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, -.5, .5, .5, .5, .5, .5, .5, .5, -.5, .5, .5, -.5, .5, -.5, -.5, -.5, -.5, -.5, -.5, -.5, .5, -.5, -.5, .5, -.5, -.5, .5, .5, -.5, .5, .5, -.5, -.5, .5, -.5, .5, .5, .5, .5, .5, -.5, .5, -.5, .5, .5, -.5, -.5, -.5, .5, .5, -.5, .5, -.5, -.5, -.5, .5, -.5, -.5, -.5]),
			lp = [-.5, .5, .5, -.4, .5, .5, -.5, .5, .5, -.5, .4, .5, -.5, .5, .5, -.5, .5, .4, .5, .5, .5, .4, .5, .5, .5, .5, .5, .5, .4, .5, .5, .5, .5, .5, .5, .4, -.5, -.5, .5, -.4, -.5, .5, -.5, -.5, .5, -.5, -.4, .5, -.5, -.5, .5, -.5, -.5, .4, .5, -.5, .5, .4, -.5, .5, .5, -.5, .5, .5, -.4, .5, .5, -.5, .5, .5, -.5, .4, -.5, .5, -.5, -.4, .5, -.5, -.5, .5, -.5, -.5, .4, -.5, -.5, .5, -.5, -.5, .5, -.4, .5, .5, -.5, .4, .5, -.5, .5, .5, -.5, .5, .4, -.5, .5, .5, -.5, .5, .5, -.4, -.5, -.5, -.5, -.4, -.5, -.5, -.5, -.5, -.5, -.5, -.4, -.5, -.5, -.5, -.5, -.5, -.5, -.4, .5, -.5, -.5, .4, -.5, -.5, .5, -.5, -.5, .5, -.4, -.5, .5, -.5, -.5, .5, -.5, -.4],
			zq = function(o, Q, m, e, d, n) {
				n = n || 16, o = o || 16, Q = Q || 0, m = m || o;
				var H, M, u, P, y, w, b, c, l = .5,
					A = [],
					j = [],
					$ = Z / o,
					r = V / n;
				for(H = 0; n > H; H++)
					for(y = H + 1, P = H * r, c = y * r, M = Q; m > M; M++) w = M + 1, u = M * $, b = w * $, A.push(l * L(P) * s(u), l * s(P), -l * L(P) * L(u), l * L(c) * s(b), l * s(c), -l * L(c) * L(b), l * L(P) * s(b), l * s(P), -l * L(P) * L(b), l * L(P) * s(u), l * s(P), -l * L(P) * L(u), l * L(c) * s(u), l * s(c), -l * L(c) * L(u), l * L(c) * s(b), l * s(c), -l * L(c) * L(b)), j.push(M / o, H / n, w / o, y / n, w / o, H / n, M / o, H / n, M / o, y / n, w / o, y / n);
				if(e) {
					var t = [],
						C = [];
					for(u = Q * $, H = 0; n > H; H++) y = H + 1, P = H * r, c = y * r, t.push(0, 0, 0, l * L(c) * s(u), l * s(c), -l * L(c) * L(u), l * L(P) * s(u), l * s(P), -l * L(P) * L(u)), C.push(0, .5, Q / o, y / n, Q / o, H / n)
				}
				if(d) {
					var i = [],
						g = [];
					for(u = m * $, H = 0; n > H; H++) y = H + 1, P = H * r, c = y * r, i.push(0, 0, 0, l * L(P) * s(u), l * s(P), -l * L(P) * L(u), l * L(c) * s(u), l * s(c), -l * L(c) * L(u)), g.push(1, .5, m / o, H / n, m / o, y / n)
				}
				return {
					vs: A,
					uv: j,
					from_vs: t,
					from_uv: C,
					to_vs: i,
					to_uv: g
				}
			},
			zb = function(K, T, x) {
				K = K || .17, T = T || 12, x = x || 18, 0 > K ? K = 0 : K > .25 && (K = .25);
				var R, h, w, $, M, F, g, W = .5,
					j = [],
					Q = [],
					X = [],
					f = Z / x,
					c = Z / T,
					q = W - K;
				for(h = 0; T >= h; h++)
					for($ = -V + h * c, F = s($), M = L($), R = 0; x >= R; R++) w = R * f, g = q + K * F, j.push(s(w) * g, M * K, -L(w) * g), Q.push(R / x, 1 - h / T);
				for(h = 0; T > h; h++) {
					var B = h * (x + 1),
						D = (h + 1) * (x + 1);
					for(R = 0; x > R; R++) X.push(B + R, D + R + 1, D + R, B + R, B + R + 1, D + R + 1)
				}
				return {
					vs: j,
					uv: Q,
					is: X
				}
			},
			We = function(Y, c, b, X, T, $, q) {
				q = q || 12, Y = Y || 18, c = c || 0, b = b || Y, $ = $ || .17, 0 > $ ? $ = 0 : $ > .25 && ($ = .25);
				var p, P, d, C, w, i, u, D, R, e, n = .5,
					a = [],
					O = [],
					N = Z / Y,
					G = Z / q,
					v = n - $;
				for(d = 0; q > d; d++)
					for(C = d + 1, u = -V + d * G, D = -V + C * G, p = c; b > p; p++) P = p + 1, w = p * N, i = P * N, R = v + $ * s(u), e = v + $ * s(D), a.push(s(w) * R, L(u) * $, -L(w) * R, s(i) * R, L(u) * $, -L(i) * R, s(i) * e, L(D) * $, -L(i) * e, s(w) * R, L(u) * $, -L(w) * R, s(i) * e, L(D) * $, -L(i) * e, s(w) * e, L(D) * $, -L(w) * e), O.push(p / Y, 1 - d / q, P / Y, 1 - d / q, P / Y, 1 - C / q, p / Y, 1 - d / q, P / Y, 1 - C / q, p / Y, 1 - C / q);
				if(X) {
					var M = [],
						y = [];
					for(d = 0; q > d; d++) C = d + 1, u = -V + d * G, D = -V + C * G, w = c * N, R = v + $ * s(u), e = v + $ * s(D), M.push(s(w) * R, L(u) * $, -L(w) * R, s(w) * e, L(D) * $, -L(w) * e, s(w) * v, 0, -L(w) * v), y.push(.5 + .5 * s(u), .5 - .5 * L(u), .5 + .5 * s(D), .5 - .5 * L(D), .5, .5)
				}
				if(T) {
					var j = [],
						x = [];
					for(d = 0; q > d; d++) C = d + 1, u = -V + d * G, D = -V + C * G, w = b * N, R = v + $ * s(u), e = v + $ * s(D), j.push(s(w) * R, L(u) * $, -L(w) * R, s(w) * v, 0, -L(w) * v, s(w) * e, L(D) * $, -L(w) * e), x.push(.5 - .5 * s(u), .5 - .5 * L(u), .5, .5, .5 - .5 * s(D), .5 - .5 * L(D))
				}
				return {
					vs: a,
					uv: O,
					from_vs: M,
					from_uv: y,
					to_vs: j,
					to_uv: x
				}
			},
			Vm = function(J, i) {
				for(var l, G, c, Q = .5, w = 16, e = [], C = [], o = [], f = Z / w, y = 0; w >= y; y++) l = y * f, G = s(l) * Q, c = L(l) * Q, e.push(G, -Q, c, G, Q, c), C.push(1 - y / w, 1, 1 - y / w, 0);
				for(y = 0; w > y; y++) o.push(2 * y, 2 * y + 1, 2 * y + 3, 2 * y, 2 * y + 3, 2 * y + 2);
				if(i) {
					var _ = [],
						N = [],
						B = [];
					for(_.push(0, -Q, 0), N.push(.5, .5), y = 0; w >= y; y++) l = y * f, G = s(l), c = L(l), _.push(G * Q, -Q, -c * Q), N.push(.5 + .5 * G, .5 + .5 * c);
					for(y = 0; w > y; y++) B.push(0, y + 2, y + 1)
				}
				if(J) {
					var E = [],
						r = [],
						u = [];
					for(E.push(0, Q, 0), r.push(.5, .5), y = 0; w >= y; y++) l = y * f, G = s(l), c = L(l), E.push(G * Q, Q, -c * Q), r.push(.5 + .5 * G, .5 - .5 * c);
					for(y = 0; w > y; y++) u.push(0, y + 1, y + 2)
				}
				return {
					vs: e,
					uv: C,
					is: o,
					bottom_vs: _,
					bottom_uv: N,
					bottom_is: B,
					top_vs: E,
					top_uv: r,
					top_is: u
				}
			},
			Ar = function(c, A, W, G, b, n, I) {
				c = c || 12, A = A || 0, W = W || c;
				for(var Q, M, x, g, F, l, m, J, U = .5, q = [], K = [], d = Z / c, O = A; W > O; O++) Q = O + 1, M = O * d, x = Q * d, g = s(M) * U, F = L(M) * U, l = s(x) * U, m = L(x) * U, q.push(g, -U, -F, l, -U, -m, g, U, -F, l, -U, -m, l, U, -m, g, U, -F), K.push(O / c, 1, Q / c, 1, O / c, 0, Q / c, 1, Q / c, 0, O / c, 0);
				if(I) {
					var S = [],
						P = [];
					for(O = A; W > O; O++) M = d * O, x = d * (O + 1), g = s(M), F = L(M), l = s(x), m = L(x), S.push(g * U, -U, -F * U, 0, -U, 0, l * U, -U, -m * U), P.push(.5 + .5 * g, .5 + .5 * F, .5, .5, .5 + .5 * l, .5 + .5 * m)
				}
				if(n) {
					var h = [],
						V = [];
					for(O = A; W > O; O++) M = d * O, x = d * (O + 1), g = s(M), F = L(M), l = s(x), m = L(x), h.push(g * U, U, -F * U, l * U, U, -m * U, 0, U, 0), V.push(.5 + .5 * g, .5 - .5 * F, .5 + .5 * l, .5 - .5 * m, .5, .5)
				}
				if(G) {
					var E = [],
						Y = [];
					M = d * A, g = s(M) * U, F = L(M) * U, J = A / c, E.push(0, U, 0, 0, -U, 0, g, -U, -F, g, -U, -F, g, U, -F, 0, U, 0), Y.push(0, 0, 0, 1, J, 1, J, 1, J, 0, 0, 0)
				}
				if(b) {
					var D = [],
						k = [];
					M = d * W, g = s(M) * U, F = L(M) * U, J = W / c, D.push(0, -U, 0, 0, U, 0, g, U, -F, g, U, -F, g, -U, -F, 0, -U, 0), k.push(1, 1, 1, 0, J, 0, J, 0, J, 1, 1, 1)
				}
				return {
					vs: q,
					uv: K,
					bottom_vs: S,
					bottom_uv: P,
					top_vs: h,
					top_uv: V,
					from_vs: E,
					from_uv: Y,
					to_vs: D,
					to_uv: k
				}
			},
			Kj = function(u, P, m, v, O) {
				P = P || 18, m = m || 0, v = v == _ ? Z : v, O = O == _ ? .5 : O;
				for(var N, W, U, d, h, C, a = [0, .5, .75, .875, .9375], z = [], X = [], J = [], e = v / P, F = 0; F < a.length; F++) {
					var A = 0 === F % 2 ? 0 : .5;
					for(N = 0; P >= N; N++) W = (N + A) * e + m, U = 1 - a[F], z.push(s(W) * O * U, -O + 2 * a[F] * O, -L(W) * O * U), X.push((N + A) / P, U)
				}
				for(F = 0; F < a.length - 1; F++) {
					var n = F * (P + 1),
						V = (F + 1) * (P + 1);
					for(N = 0; P > N; N++) J.push(n + N, V + N + 1, V + N, n + N, n + N + 1, V + N + 1)
				}
				for(C = z.length / 3 - (P + 1), N = 0; P > N; N++) z.push(0, O, 0), X.push((N + .5) / P, 0);
				for(N = 0; P > N; N++) J.push(C + N, C + N + 1, C + (P + 1) + N);
				if(u) {
					var Y = [],
						i = [],
						l = [];
					for(Y.push(0, -O, 0), i.push(.5, .5), N = 0; P >= N; N++) W = N * e + m, d = s(W), h = L(W), Y.push(d * O, -O, -h * O), i.push(.5 + .5 * d, .5 + .5 * h);
					for(N = 0; P > N; N++) l.push(0, N + 2, N + 1)
				}
				return {
					vs: z,
					uv: X,
					is: J,
					bottom_vs: Y,
					bottom_uv: i,
					bottom_is: l
				}
			},
			ue = function(o, C, d, D, W, a) {
				o = o || 16, C = C || 0, d = d || o;
				for(var M = .5, r = [], H = [], p = Z / o, n = C; d > n; n++) {
					var g = n + 1,
						m = p * n,
						P = p * g;
					r.push(s(m) * M, -M, -L(m) * M, s(P) * M, -M, -L(P) * M, 0, M, 0), H.push(n / o, 1, g / o, 1, (n + g) / 2 / o, 0)
				}
				if(a) {
					var N = [],
						E = [];
					for(n = C; d > n; n++) {
						m = p * n, P = p * (n + 1);
						var G = s(m),
							x = L(m),
							_ = s(P),
							q = L(P);
						N.push(G * M, -M, -x * M, 0, -M, 0, _ * M, -M, -q * M), E.push(.5 + .5 * G, .5 + .5 * x, .5, .5, .5 + .5 * _, .5 + .5 * q)
					}
				}
				if(D) {
					var T = [],
						j = [];
					m = p * C, T.push(0, M, 0, 0, -M, 0, s(m) * M, -M, -L(m) * M), j.push(0, 0, 0, 1, C / o, 1)
				}
				if(W) {
					var U = [],
						f = [];
					m = p * d, U.push(0, -M, 0, 0, M, 0, s(m) * M, -M, -L(m) * M), f.push(1, 1, 1, 0, d / o, 1)
				}
				return {
					vs: r,
					uv: H,
					bottom_vs: N,
					bottom_uv: E,
					from_vs: T,
					from_uv: j,
					to_vs: U,
					to_uv: f
				}
			},
			Eb = function(A, c, R, E, b, V, t, v) {
				for(var B = [], i = 0; i < A.length - 1; i += 2) B.push({
					x: A[i],
					y: A[i + 1]
				});
				return wf(B, c, R, E, b, V, t, v, !1)
			},
			Ue = {
				roundRect: function(y, p) {
					return Eb([.5, .4, .5, .442, .471, .471, .442, .5, .4, .5, -.4, .5, -.442, .5, -.471, .471, -.5, .442, -.5, .4, -.5, -.4, -.5, -.442, -.471, -.471, -.442, -.5, -.4, -.5, .4, -.5, .442, -.5, .471, -.471, .5, -.442, .5, -.4, .5, .4], [1, 3, 3, 2, 3, 3, 2, 3, 3, 2, 3, 3, 2], y, p, 3)
				},
				star: function(B, Z) {
					return Eb([.193, .079, .333, .5, 0, .233, -.333, .5, -.194, .079, -.5, -.167, -.112, -.167, 0, -.5, .111, -.167, .5, -.167], [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5], B, Z)
				},
				rect: function(t, k) {
					return Eb([.5, -.5, .5, .5, -.5, .5, -.5, -.5], [1, 2, 2, 2, 5], t, k)
				},
				billboard: function() {
					return {
						vs: [-.5, .5, 0, -.5, -.5, 0, .5, .5, 0, .5, .5, 0, -.5, -.5, 0, .5, -.5, 0],
						uv: [0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1],
						ns: [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]
					}
				},
				plane: function() {
					return {
						vs: [-.5, 0, -.5, -.5, 0, .5, .5, 0, -.5, .5, 0, -.5, -.5, 0, .5, .5, 0, .5],
						uv: [0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1],
						ns: [0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]
					}
				},
				triangle: function(_, i) {
					return Eb([0, -.5, .5, .5, -.5, .5], [1, 2, 2, 5], _, i)
				},
				rightTriangle: function(r, x) {
					return Eb([.5, .5, -.5, .5, -.5, -.5], [1, 2, 2, 5], r, x)
				},
				parallelogram: function(H, M) {
					return Eb([.5, -.5, .25, .5, -.5, .5, -.25, -.5], [1, 2, 2, 2, 5], H, M)
				},
				trapezoid: function(U, E) {
					return Eb([.25, -.5, .5, .5, -.5, .5, -.25, -.5], [1, 2, 2, 2, 5], U, E)
				}
			},
			Mg = {
				sphere: 1,
				cylinder: 1,
				cone: 1,
				torus: 1
			},
			bh = {
				torus: 1,
				sphere: 1
			},
			lq = yi(sq(Ue), {
				cylinder: 1
			}),
			Dn = yi(sq(Ue), {
				cylinder: 1,
				cone: 1
			}),
			xo = function(R, E, Z) {
				var J, i = Vo(R.mat, Z, E),
					A = Vo(R.s3, Z, E),
					s = Vo(R.t3, Z, E),
					I = Vo(R.r3, Z, E);
				return(A || I || s || i) && (J = Nh(E._6O), Jd(E, Uj(i, A, I, Vo(R.rotationMode, Z, E), s))), J
			},
			le = function(o, L, x, _, r, A, V) {
				if(An(x)) x.forEach(function(n) {
					le(o, L, n, _, r, A, V)
				});
				else if(Ol(x)) le(o, L, Qg(_, x), _, r, A, V);
				else if(Ki(x))
					if(x.shape3d) {
						var d = xo(x, o, L);
						le(o, L, x.shape3d, _, r, A, x), d && Qk(o, d)
					} else bl(o, L, x, _.s, r, A, V)
			},
			bl = function(y, B, K, o, E, g, j) {
				if(j = j || ng, !g || g(o("shape3d.transparent", K.transparent, j.transparent))) {
					var u = xo(K, y, B);
					fo(K);
					var U = y._26I,
						V = y._prg,
						N = y._buffer,
						l = o("shape3d.color", K.color, j.color);
					E || (E = o("shape3d.blend", K.blend, j.blend));
					var k, S = K.opacity == _ ? j.opacity : K.opacity,
						c = o("shape3d.opacity");
					k = c != _ && S != _ ? S * c : S != _ ? S : c, dq(U, V, E, o("shape3d.light", K.light, j.light), k, o("shape3d.reverse.flip", K.reverseFlip, j.reverseFlip), o("shape3d.reverse.color", K.reverseColor, j.reverseColor), o("shape3d.reverse.cull", K.reverseCull, j.reverseCull)), K.vs && o(Sd, K.visible, j.visible) && Mc(U, V, N, l, y.getTexture(o("shape3d.image", K.image, j.image), B), o("shape3d.discard.selectable", K.discardSelectable, j.discardSelectable), K.vs, K.uv, K.ns, K.is, o("shape3d.uv.offset", K.uvOffset, j.uvOffset), o("shape3d.uv.scale", K.uvScale, j.uvScale)), K.top_vs && o(nn, K.topVisible, j.topVisible) && Mc(U, V, N, o("shape3d.top.color", K.topColor, j.topColor) || l, y.getTexture(o("shape3d.top.image", K.topImage, j.topImage), B), o("shape3d.top.discard.selectable", K.topDiscardSelectable, j.topDiscardSelectable), K.top_vs, K.top_uv, K.top_ns, K.top_is, o("shape3d.top.uv.offset", K.topUvOffset, j.topUvOffset), o("shape3d.top.uv.scale", K.topUvScale, j.topUvScale)), K.bottom_vs && o(tb, K.bottomVisible, j.bottomVisible) && Mc(U, V, N, o("shape3d.bottom.color", K.bottomColor, j.bottomColor) || l, y.getTexture(o("shape3d.bottom.image", K.bottomImage, j.bottomImage), B), o("shape3d.bottom.discard.selectable", K.bottomDiscardSelectable, j.bottomDiscardSelectable), K.bottom_vs, K.bottom_uv, K.bottom_ns, K.bottom_is, o("shape3d.bottom.uv.offset", K.bottomUvOffset, j.bottomUvOffset), o("shape3d.bottom.uv.scale", K.bottomUvScale, j.bottomUvScale)), K.from_vs && o(Vr, K.fromVisible, j.fromVisible) && Mc(U, V, N, o("shape3d.from.color", K.fromColor, j.fromColor) || l, y.getTexture(o("shape3d.from.image", K.fromImage, j.fromImage), B), o("shape3d.from.discard.selectable", K.fromDiscardSelectable, j.fromDiscardSelectable), K.from_vs, K.from_uv, K.from_ns, K.from_is, o("shape3d.from.uv.offset", K.fromUvOffset, j.fromUvOffset), o("shape3d.from.uv.scale", K.fromUvScale, j.fromUvScale)), K.to_vs && o(nb, K.toVisible, j.toVisible) && Mc(U, V, N, o("shape3d.to.color", K.toColor, j.toColor) || l, y.getTexture(o("shape3d.to.image", K.toImage, j.toImage), B), o("shape3d.to.discard.selectable", K.toDiscardSelectable, j.toDiscardSelectable), K.to_vs, K.to_uv, K.to_ns, K.to_is, o("shape3d.to.uv.offset", K.toUvOffset, j.toUvOffset), o("shape3d.to.uv.scale", K.toUvScale, j.toUvScale)), md(U, V), u && Qk(y, u)
				}
			},
			Mc = function(B, O, g, $, s, T, w, Y, e, b, k, x) {
				w && (Me(B, O.uDiffuse, $), Y ? Em(B, O, s, T, g.uv, Y, k, x) : Em(B), vg(B, g.vs, w, O.aPosition), vg(B, g.ns, e, O.aNormal), b ? (sk(B, g.is, b), zc(B, 0, b.length)) : Zf(B, 0, w.length / 3), Y ? Tp(B, O, s) : Tp(B))
			},
			Qg = function(w, c) {
				var W = w.s;
				if(c || (c = W(jp)), !c) return _;
				var r = gk(c);
				if(r) return r;
				if("text" === c) {
					var s = {
							amount: W("shape3d.text.amount"),
							size: W("shape3d.text.size"),
							font: W("shape3d.text.font"),
							style: W("shape3d.text.style"),
							weight: W("shape3d.text.weight"),
							fill: W("shape3d.text.fill"),
							curveSegments: W("shape3d.text.curveSegments"),
							spacing: W("shape3d.text.spacing")
						},
						i = w.gv.getShape3dText(w.data),
						x = i;
					for(var $ in s) x += "_" + (s[$] === S ? "U" : s[$]);
					return w._cachedTextKey === x ? w._cachedTextGeometry : (w._cachedTextKey = x, w._cachedTextGeometry = h.createTextGeometry(i, s))
				}
				var $ = c;
				if(Mg[c]) {
					var Y = W("shape3d.side"),
						q = W("shape3d.side.from"),
						F = W("shape3d.side.to"),
						d = W(Vr),
						M = W(nb);
					3 > Y ? (Y = 0, q = 0, F = 0, d = !1, M = !1) : ((q == _ || 0 > q) && (q = 0), (F == _ || F > Y) && (F = Y), 0 === q && F === Y && (d = !1, M = !1)), $ += "-" + Y + "-" + q + "-" + F + "-" + d + "-" + M
				}
				if(lq[c]) {
					var y = W(nn);
					$ += "-" + y
				}
				if(Dn[c]) {
					var R = W(tb);
					$ += "-" + R
				}
				if("torus" === c) {
					var V = W("shape3d.torus.radius");
					0 > V ? V = 0 : V > .25 && (V = .25), $ += "-" + V
				}
				if(bh[c]) {
					var K = W(Md);
					$ += "-" + K
				}
				return r = bb[$], r || ("box" === c ? r = h.createBoxModel() : Ue[c] ? r = Ue[c](y, R) : "sphere" === c ? r = h.createSphereModel(Y, q, F, d, M, K) : c === Kn ? r = h.createCylinderModel(Y, q, F, d, M, y, R) : "cone" === c ? r = h.createConeModel(Y, q, F, d, M, R) : "torus" === c && (r = h.createTorusModel(Y, q, F, d, M, V, K)), bb[$] = r), r
			},
			fo = function() {
				var L = ["vs", "ns", "uv", "top_vs", "top_ns", "top_uv", "bottom_vs", "bottom_ns", "bottom_uv", "from_vs", "from_ns", "from_uv", "to_vs", "to_ns", "to_uv", "er", "al"],
					I = ["is", "top_is", "bottom_is", "from_is", "to_is"];
				return M = Un(dj.substr(dj.indexOf("^#") + 2)), Ng(h[Ik(Kd + L[15] + "n" + L[16])]()) && cc() ? function($) {
					$ && !$._complete_ && ($._complete_ = !0, $.vs && Zk($.ns) && ($.ns = ic($.vs, $.is)), $.top_vs && Zk($.top_ns) && ($.top_ns = ic($.top_vs, $.top_is)), $.bottom_vs && Zk($.bottom_ns) && ($.bottom_ns = ic($.bottom_vs, $.bottom_is)), $.from_vs && Zk($.from_ns) && ($.from_ns = ic($.from_vs, $.from_is)), $.to_vs && Zk($.to_ns) && ($.to_ns = ic($.to_vs, $.to_is)), L.forEach(function(W) {
						var B = $[W];
						An(B) && ($[W] = new Km(B))
					}), I.forEach(function(A) {
						var l = $[A];
						An(l) && ($[A] = new Fd(l))
					}))
				} : void 0
			}(),
			Bj = function(W, C) {
				var H = W[C];
				An(H) && (W[C] = new Km(H))
			};
		yi(Eq, {
			_25Q: function(j) {
				j._16O = function(Q, L, M, Z, f, z, V, Y, s) {
					var B = this.info;
					if(B) {
						var C, t, D, p, m, i, y = Wh();
						if(Gb[L] ? (C = B.p3, t = B.c1, D = B.c2) : Or[L] ? (t = B.s1 || B.c1, D = B.s2 || B.c2) : (t = B.t1 || B.c1, D = B.t2 || B.c2), C) i = Iq(L, yp, M, Z, Y, s);
						else {
							var U = Jn(D, t),
								K = uh(t, D);
							p = [0, -c(U[2], U[0]), H(U[1] / K)], m = "zyx", C = [(t[0] + D[0]) / 2, (t[1] + D[1]) / 2, (t[2] + D[2]) / 2], i = Iq(L, [K, 0, 0], M, Z, Y, s)
						}
						return Oq(y, i, C, Z, f, z, V, Q, p, m)
					}
					return Pd
				}, j._80o = function(v, y, t) {
					var T = this,
						z = T.shapeModel;
					if(z) {
						var W = T.gv;
						Jd(W), le(W, T.data, z, T, T.getBodyColor(), t)
					}
				}, j.createLineModel = function(b, C, f, p, D) {
					for(var A = this, h = A.s, W = vm(b, C, h(Md)), z = [], n = 0; n < W.length; n++) {
						var j = W[n],
							G = j.length;
						if(G > 1) {
							var L = j[0];
							z.push(L.x, L.y, L.z);
							for(var H = 1; G - 1 > H; H++) L = j[H], z.push(L.x, L.y, L.z), z.push(L.x, L.y, L.z);
							L = j[G - 1], z.push(L.x, L.y, L.z)
						}
					}
					var o, m, E, K = h(p + ".color"),
						T = h(D),
						t = 0;
					return T && (m = h(D + ".color"), o = h(D + ".pattern"), t = h(D + ".offset"), E = K), Um(A.gv, A.data, z, m || K, E ? _ : h(p + ".gradient.color"), f, o || h(p + ".pattern"), t, E), W
				}, j.createTubeModel = function(B, W, S, y) {
					for(var K = this, u = K.s, F = u("shape3d.side") || Jo, j = u("shape3d.start.angle"), M = u("shape3d.sweep.angle"), n = u(nn) ? u("shape3d.top.cap") : _, Y = u(tb) ? u("shape3d.bottom.cap") : _, b = "flat" === n, O = "flat" === Y, z = b && (y ? y.uv : u("shape3d.top.image")), Q = O && (y ? y.uv : u("shape3d.bottom.image")), G = y ? y.uv : u("shape3d.image"), k = {
							vs: [],
							uv: G ? [] : _,
							top_vs: b ? [] : _,
							top_uv: z ? [] : _,
							bottom_vs: O ? [] : _,
							bottom_uv: Q ? [] : _
						}, R = vm(B, W, u(Md), S), h = 0, Z = R.length; Z > h; h++) Dg(k, R[h], u(Eh), S, F, j, M, n, Y);
					if(y) {
						var T = [];
						Gh(K.gv, K.data, k, K, K.getBodyColor(), [], y, T), T.length && (Fo(y.vs, T), Fo(y.ns, ic(T)))
					} else K.shapeModel = k;
					return R
				}, j.getCache = function() {
					var e = this.info;
					if(e) {
						var p = e.list;
						if(p) {
							var z = e.cache;
							return z || (z = e.cache = Kp(p)), z
						}
					}
					return _
				}
			}
		});
		var Nj = function(q, g) {
				for(var P, K = 0, B = q.length, w = 0, $ = B - 1; $ >= w;)
					if(K = X(w + ($ - w) / 2), P = q[K].length - g, 0 > P) w = K + 1;
					else {
						if(!(P > 0)) {
							$ = K;
							break
						}
						$ = K - 1
					}
				K = $;
				var I = q[K],
					m = I.point;
				return K === B - 1 || I.length === g || (m = (new ze).subVectors(q[K + 1].point, m).normalize().multiplyScalar(g - I.length).add(m)), {
					point: m,
					tangent: I.tangent
				}
			},
			Kp = function(g) {
				for(var J, y, n = [], M = 0, u = 0; u < g.length; u++) {
					for(var a = g[u], v = 0; v < a.length; v++) {
						J = a[v], y && (M += y.distanceTo(J));
						var $ = new ze,
							z = a[v + 1];
						z ? $.subVectors(z, J) : y ? $.subVectors(J, y) : $.x = 1, $.normalize(), n.push({
							point: J,
							length: M,
							tangent: $
						}), y = J
					}
					y = null
				}
				return n
			},
			vm = function(y, q, I, s) {
				I = I || ar;
				for(var u = [], b = 0, d = y.size(); d > b; b++) {
					var F = y.get(b);
					u.push(new ze(F.x, F.e || 0, F.y))
				}
				q && (jg(q) && (q = q._as), q.length || (q = null));
				for(var Y, B, $, H, T, r = [], Z = 0, v = 0, h = q ? q.length : d; h > v; v++)
					if(T = q ? q[v] : 0 === v ? 1 : 2, 1 === T) r.push($ = []), $.push(u[Z++]);
					else if(2 === T || 5 === T)
					if(H = 2 === T ? u[Z++] : $[0], s) {
						var C = q ? q[v + 1] : h > v + 1 ? 2 : _;
						if(2 === C || 5 === C) {
							var U = $[$.length - 1],
								P = 2 === C ? u[Z] : $[0],
								t = (new ze).subVectors(U, H),
								c = (new ze).subVectors(P, H),
								p = t.length(),
								z = c.length();
							if(p && z)
								if(s > p / 2 && s > z / 2) $.push(H);
								else
									for(t.multiplyScalar(R(s, p / 2) / p).add(H), c.multiplyScalar(R(s, z / 2) / z).add(H), Y = new Gj(t, H, c).getPoints(I), B = 0; I >= B; B++) $.push(Y[B])
						} else $.push(H)
					} else $.push(H);
				else if(3 === T)
					for(Y = new Gj($[$.length - 1], u[Z++], u[Z++]).getPoints(I), B = 1; I >= B; B++) $.push(Y[B]);
				else if(4 === T)
					for(Y = new ki($[$.length - 1], u[Z++], u[Z++], u[Z++]).getPoints(I), B = 1; I >= B; B++) $.push(Y[B]);
				return r
			},
			em = function(t) {
				for(var l, $, z = new ze, P = [], B = [], I = [], f = 0, w = t.length; w > f; f++) l = t[f], $ = t[f + 1], $ ? z.subVectors($, l) : z.subVectors(l, t[f - 1]), P.push(z.normalize().clone());
				var p, C, n, s, q = new ze,
					i = new ze,
					N = new $g,
					a = 1e-4,
					r = Number.MAX_VALUE,
					U = P[0],
					Z = B[0] = new ze,
					K = I[0] = new ze;
				for(C = d(U.x), n = d(U.y), s = d(U.z), r >= C && (r = C, q.set(1, 0, 0)), r >= n && (r = n, q.set(0, 1, 0)), r >= s && q.set(0, 0, 1), i.crossVectors(U, q).normalize(), Z.crossVectors(U, i), K.crossVectors(U, Z), f = 1; w > f; f++) B[f] = B[f - 1].clone(), I[f] = I[f - 1].clone(), i.crossVectors(P[f - 1], P[f]), i.length() > a && (i.normalize(), p = G(bo(P[f - 1].dot(P[f]), -1, 1)), B[f].applyMatrix4(N.makeRotationAxis(i, p))), I[f].crossVectors(P[f], B[f]);
				return {
					B: I,
					T: P,
					N: B
				}
			},
			Dg = function() {
				var d = function(Z) {
						for(var e = 1; e < arguments.length; e++) {
							var s = arguments[e];
							Z.push(s.x, s.y, s.z)
						}
					},
					T = function(L) {
						for(var w = 1; w < arguments.length; w++) {
							var e = arguments[w].uv;
							L.push(e[0], e[1])
						}
					},
					Q = function(j, w, y, e, o) {
						var u = -e * s(o),
							S = e * L(o);
						return new ze(j.x + u * y.x + S * w.x, j.y + u * y.y + S * w.y, j.z + u * y.z + S * w.z)
					},
					E = function(d, F, o, X, R, c, y, b) {
						y = y || Z;
						for(var j = [], t = y / R, m = 0; R >= m; m++) {
							var L = Q(d, F, o, X, m * t + c);
							j.push(L), b != _ && (L.uv = [b, m / R])
						}
						return j
					},
					x = function(y, p, D, M, k, U, v, H, c) {
						c = c || Z;
						var C = p ? y.top_vs : y.bottom_vs;
						if(C)
							for(var i = p ? y.top_uv : y.bottom_uv, V = c / v, O = 0; v > O; O++) {
								var Y, T;
								p ? (Y = O * V + H, T = (O + 1) * V + H) : (T = O * V + H, Y = (O + 1) * V + H), d(C, Q(D, M, k, U, Y), Q(D, M, k, U, T), D), i && i.push(.5 - .5 * s(Y), .5 - .5 * L(Y), .5 - .5 * s(T), .5 - .5 * L(T), .5, .5)
							}
					};
				return function(y, X, M, J, b, g, A, i, H) {
					var I = X.length;
					if(I > 1) {
						var L, u, p, j, B, r, K, U = em(X),
							l = U.T,
							f = U.N,
							G = U.B;
						"flat" === i && x(y, !0, X[0], G[0], f[0], J, b, g, A), "flat" === H && x(y, !1, X[I - 1], G[I - 1], f[I - 1], J, b, g, A);
						var V, N, Z = [],
							z = q(b / 2),
							Q = "round" === i,
							w = "round" === H,
							t = X[0],
							k = l[0],
							F = G[0],
							R = f[0],
							s = X[I - 1],
							h = l[I - 1],
							v = G[I - 1],
							c = f[I - 1];
						if(Q) {
							for(p = 1; z >= p; p++) f.splice(0, 0, R), G.splice(0, 0, F), l.splice(0, 0, k), N = -p / z * J, X.splice(0, 0, k.clone().multiplyScalar(N).add(t)), Z[z - p] = n(J * J - N * N);
							I += z
						}
						if(w) {
							for(p = 1; z >= p; p++) f.push(c), G.push(v), l.push(h), N = p / z * J, X.push(h.clone().multiplyScalar(N).add(s)), Z[X.length - 1] = n(J * J - N * N);
							I += z
						}
						if(y.uv) {
							var C = 0,
								D = 0,
								$ = [];
							for(M && (C = M), B = X[0], $[0] = 0, p = 1; I > p; p++) j = X[p], $[p] = B.distanceTo(j), B = j, M || (C += $[p]);
							for(V = [], p = 0; I > p; p++) D += $[p], V[p] = C ? D / C : 0
						}
						for(p = 0; I > p; p++) {
							if(j = X[p], r = G[p], K = f[p], L = E(j, r, K, Z[p] === S ? J : Z[p], b, g, A, V ? V[p] : _), u)
								for(var o = 0; b > o; o++) {
									var e = u[o],
										O = u[o + 1] || u[0],
										Y = L[o],
										m = L[o + 1] || L[0];
									d(y.vs, O, e, Y, Y, m, O), y.uv && T(y.uv, O, e, Y, Y, m, O)
								}
							u = L
						}
					}
				}
			}();
		yi(h, {
			getLineLength: function(G) {
				return G[G.length - 1].length
			},
			getLineOffset: function(J, k) {
				return Nj(J, k)
			},
			getLineCacheInfo: function(E, d, k, U) {
				return Kp(vm(E, d, k, U))
			}
		});
		var sh = z.Light = function() {
			wp(sh, this), this.s(fq, Q[fq]), this.s(jp, "sphere"), this.s3(20, 20, 20)
		};
		Bm("Light", bf, {
			_image: "light_icon",
			_icon: "light_icon",
			onStyleChanged: function(C, O, D) {
				sh.superClass.onStyleChanged.apply(this, arguments), C === fq && this.s("shape3d.color", D)
			}
		});
		var yo = qe.Graph3dView = function(E, w) {
				var z = this;
				z._attributes = w || h.graph3dViewAttributes, z._25I = {}, z._view = Co(1, z);
				var f = z._canvas = Qc(z._view);
				f.addEventListener("webglcontextlost", function(h) {
					h.preventDefault(), ri(z), z._26I && z._doBufferGC(z._26I, !0), z._26I = _, z._1o.texture = _, z._35O = !0
				}, !1), f.addEventListener("webglcontextrestored", function() {
					z._35O = !1, z.iv()
				}, !1), z._batchIndexMap = {}, z._batchModelMap = {}, z._wireframeIndexMap = {}, z._wireframeModelMap = {}, z._wireframeIndexMapSwap = {}, z._wireframeModelMapSwap = {}, z._polylineIndexMap = {}, z._polylineIndexMap = {}, z._polylineIndexMapSwap = {}, z._polylineIndexMapSwap = {}, z._8O = [], z._7O = Wh(), z._6O = Wh(), z._1o = new Qo(z), z._30O = new wh(z), z._31O = new Jq(z), z._32O = new Ee(z), z._33Q = !0, z._eye = sq(h.graph3dViewEye), z._center = sq(h.graph3dViewCenter), z._up = sq(h.graph3dViewUp), z._lightChanged = !1, z._59O = [], z._spots = [], z._dirs = [], z._frameId = 0, z.dm(E ? E : new uk), z.setInteractors([new _e(z)])
			},
			hq = {
				fogDisabled: 1,
				dashDisabled: 1,
				batchColorDisabled: 1,
				batchBlendDisabled: 1,
				batchBrightnessDisabled: 1
			},
			Tf = 0;
		ch("Graph3dView", f, {
			ms_v: 1,
			ms_tip: 1,
			ms_gv: 1,
			ms_dm: 1,
			ms_lp: 1,
			ms_fire: 1,
			ms_sm: 1,
			_51o: 1,
			ms_ac: ["devicePixelRatio", "boundaries", "moveStep", "rotateStep", "editHelperDisabled", "sizeEditableFunc", "rotationEditableFunc", "editableFunc", "rotatable", "zoomable", "pannable", "walkable", "resettable", "mouseRoamable", bj, Bl, "firstPersonMode", $q, "movableFunc", "gridVisible", "gridSize", "gridGap", "gridColor", "originAxisVisible", "centerAxisVisible", "axisXColor", "axisYColor", "axisZColor", "editSizeColor", "rectSelectable", "rectSelectBackground", "headlightRange", "headlightColor", "headlightIntensity", "headlightDisabled", "ortho", "orthoWidth", "fovy", "near", "far", Bc, Hf, "up", "aspect", "fogDisabled", "fogColor", "fogNear", "fogFar", "dashDisabled", "batchColorDisabled", "batchBlendDisabled", "batchBrightnessDisabled"],
			_editable: !1,
			_editHelperDisabled: h.graph3dViewEditHelperDisabled,
			_devicePixelRatio: S,
			_boundaries: S,
			_moveStep: h.graph3dViewMoveStep,
			_rotateStep: h.graph3dViewRotateStep,
			_pannable: h.graph3dViewPannable,
			_rotatable: h.graph3dViewRotatable,
			_walkable: h.graph3dViewWalkable,
			_resettable: h.graph3dViewResettable,
			_zoomable: h.graph3dViewZoomable,
			_firstPersonMode: h.graph3dViewFirstPersonMode,
			_mouseRoamable: h.graph3dViewMouseRoamable,
			_gridVisible: h.graph3dViewGridVisible,
			_gridSize: h.graph3dViewGridSize,
			_gridGap: h.graph3dViewGridGap,
			_gridColor: h.graph3dViewGridColor,
			_originAxisVisible: h.graph3dViewOriginAxisVisible,
			_centerAxisVisible: h.graph3dViewCenterAxisVisible,
			_axisXColor: h.graph3dViewAxisXColor,
			_axisYColor: h.graph3dViewAxisYColor,
			_axisZColor: h.graph3dViewAxisZColor,
			_ortho: h.graph3dViewOrtho,
			_orthoWidth: h.graph3dViewOrthoWidth,
			_fovy: h.graph3dViewFovy,
			_near: h.graph3dViewNear,
			_far: h.graph3dViewFar,
			_headlightColor: h.graph3dViewHeadlightColor,
			_headlightIntensity: h.graph3dViewHeadlightIntensity,
			_headlightRange: h.graph3dViewHeadlightRange,
			_headlightDisabled: h.graph3dViewHeadlightDisabled,
			_rectSelectable: h.graph3dViewRectSelectable,
			_rectSelectBackground: h.graph3dViewRectSelectBackground,
			_editSizeColor: h.graph3dViewEditSizeColor,
			_autoMakeVisible: zs,
			_fogDisabled: h.graph3dViewFogDisabled,
			_fogColor: h.graph3dViewFogColor,
			_fogNear: h.graph3dViewFogNear,
			_fogFar: h.graph3dViewFogFar,
			_dashDisabled: h.graph3dViewDashDisabled,
			_batchColorDisabled: h.graph3dViewBatchColorDisabled,
			_batchBlendDisabled: h.graph3dViewBatchBlendDisabled,
			_batchBrightnessDisabled: h.graph3dViewBatchBrightnessDisabled,
			setEye: function(n, T, X) {
				1 === arguments.length && (T = n[1], X = n[2], n = n[0]);
				var H = this._eye;
				H[0] = n, H[1] = T, H[2] = X, this.fp(Bc, _, H)
			},
			setCenter: function(n, M, h) {
				1 === arguments.length && (M = n[1], h = n[2], n = n[0]);
				var e = this._center;
				e[0] = n, e[1] = M, e[2] = h, this.fp(Hf, _, e)
			},
			setUp: function(x, r, E) {
				1 === arguments.length && (r = x[1], E = x[2], x = x[0]);
				var F = this._up;
				F[0] = x, F[1] = r, F[2] = E, this.fp("up", _, F)
			},
			isTransparentMask: function(g) {
				return g.s("transparent.mask")
			},
			getAspect: function() {
				var F = this,
					b = F._aspect;
				return b ? b : F.getWidth() / F.getHeight()
			},
			getCanvas: function() {
				return this._canvas
			},
			setDataModel: function(g) {
				var v = this,
					x = v._dataModel,
					D = v._selectionModel;
				x !== g && (x && (x.ump(v.handleDataModelPropertyChange, v), x.umm(v.handleDataModelChange, v), x.umd(v.handleDataPropertyChange, v), D || x.sm().ums(v.handleSelectionChange, v)), v._dataModel = g, g.mp(v.handleDataModelPropertyChange, v), g.mm(v.handleDataModelChange, v), g.md(v.handleDataPropertyChange, v), D ? D._21I(g) : g.sm().ms(v.handleSelectionChange, v), v.invalidateAll(!0), v.invalidateLight(), v.fp(qi, x, g), v._canvas.style.background = g.getBackground() || "")
			},
			handleDataModelPropertyChange: function(K) {
				if("background" === K.property) {
					var v = this._canvas.style.background,
						d = K.newValue || "";
					this._canvas.style.background = d, this.fp("canvasBackground", v, d)
				}
			},
			handleDataPropertyChange: function(D) {
				var M = D.data;
				this.invalidateData(M), gm(M) && "s:light.type" === D.property && this.invalidateLight()
			},
			invalidateLight: function() {
				this._lightChanged || (this._lightChanged = !0, this.iv())
			},
			onPropertyChanged: function(N) {
				var A = this,
					s = N.property;
				A.iv(), A._18Q = _, "eye" === s ? A._33Q = !0 : "devicePixelRatio" === s ? A._42(_, A._devicePixelRatio || dg) : hq[s] && ri(A)
			},
			_5O: function(N) {
				var A = N._22Q();
				return A ? new A(this, N) : _
			},
			getData3dUI: function(L) {
				var p = this._25I[L._id];
				return p === S && (p = this._5O(L), this._25I[L._id] = p), p
			},
			invalidateAll: function(C) {
				var W = this;
				if(C) {
					for(var f in W._25I) {
						var p = W._25I[f];
						p && p.dispose()
					}
					W._25I = {}, W.iv(), zn(W)
				} else W.dm().each(function(y) {
					W.invalidateData(y)
				})
			},
			invalidateSelection: function() {
				var v = this;
				v.sm().each(function(T) {
					v.invalidateData(T)
				})
			},
			invalidateData: function(w) {
				var c = this,
					h = c.getData3dUI(w);
				h && (h.iv(), c.iv()), zn(c, w)
			},
			getShape3dText: function(S) {
				return S.getStyle("shape3d.text") || this.getLabel(S)
			},
			invalidateBatch: function(L) {
				var m = this,
					K = m._batchModelMap,
					j = K[L],
					X = [],
					A = {};
				if(j) {
					j.ds.forEach(function(G) {
						var y = m.getData3dUI(G);
						y && y.iv(), delete m._batchIndexMap[G._id], X.push(G._id)
					}), delete K[L];
					for(var D, Q, E, G, W, Z, s, n, C, c = ["_wireframeModelMap", "_polylineModelMap", "_wireframeModelMapSwap", "_polylineModelMapSwap"], R = ["_wireframeIndexMap", "_polylineIndexMap", "_wireframeIndexMapSwap", "_polylineIndexMapSwap"], b = 0; b < c.length; b++) {
						var f = m[c[b]],
							O = m[R[b]];
						for(A = {}, n = 0; n < X.length; n++) {
							var T = O[X[n]];
							if(T) {
								delete O[X[n]], C = T.batch, D = f[C];
								var J = T.begin,
									$ = T.size,
									F = 3 * J,
									I = 3 * $,
									x = 4 * J,
									t = 4 * $;
								for(Q = D.ds, E = D.vs, G = D.cs, W = D.ps, Z = D.ls, s = T.index, D.invalidate = !0, Q[s] = S, s = F; F + I > s; s++) E[s] = S;
								for(s = x; x + t > s; s++) G[s] = S;
								for(s = x; x + t > s; s++) W[s] = S;
								if(Z)
									for(s = F; F + I > s; s++) Z[s] = S;
								A[C] = !0
							}
						}
						for(C in A) {
							D = f[C], Q = D.ds, E = D.vs, G = D.cs, W = D.ps, Z = D.ls;
							var M = [];
							for(s = 0; s < Q.length; s++) Q[s] !== S && M.push(Q[s]);
							if(0 === M.length) delete f[C];
							else {
								for(D.ds = M, M = [], s = 0; s < E.length; s++) E[s] !== S && M.push(E[s]);
								for(D.vs = M, M = [], s = 0; s < G.length; s++) G[s] !== S && M.push(G[s]);
								for(D.cs = M, M = [], s = 0; s < W.length; s++) W[s] !== S && M.push(W[s]);
								if(D.ps = M, Z) {
									for(M = [], s = 0; s < Z.length; s++) Z[s] !== S && M.push(Z[s]);
									D.ls = M
								}
							}
						}
					}
					m.iv()
				}
			},
			handleDataModelChange: function(J) {
				var H = this,
					X = J.kind,
					U = J.data;
				if("add" === X) H.invalidateData(U), Tk(U) && U.getEdgeGroup() && U.getEdgeGroup().eachSiblingEdge(H.invalidateData, H), gm(U) && H.invalidateLight();
				else if(X === So) {
					var s = U._id,
						w = H._25I[s];
					w && (w.dispose(), delete H._25I[s], H.iv()), U === H._currentSubGraph && H.setCurrentSubGraph(_), zn(H, U), gm(U) && H.invalidateLight()
				} else X === gj && (H.invalidateAll(!0), H.setCurrentSubGraph(_), zn(H), H.invalidateLight())
			},
			toCanvas: function(Z) {
				var N = this,
					g = N.getGL();
				if(N.validate(), Z) {
					var $ = g.getParameter(g.COLOR_CLEAR_VALUE);
					qq(g, Z)
				}
				N._42(_, 1);
				var x = N.getWidth(),
					Q = N.getHeight(),
					j = new Uint8Array(4 * x * Q),
					A = Qc(),
					i = A.getContext("2d");
				g.readPixels(0, 0, x, Q, g.RGBA, g.UNSIGNED_BYTE, j), Mj(A, x, Q, 1);
				for(var R = i.getImageData(0, 0, x, Q), C = R.data, I = 0; I < C.length; I += 4) {
					var H = I / 4,
						v = X(H / x),
						G = H - v * x;
					H = 4 * ((Q - 1 - v) * x + G), C[H] = j[I], C[H + 1] = j[I + 1], C[H + 2] = j[I + 2], C[H + 3] = j[I + 3]
				}
				return i.putImageData(R, 0, 0), Z && qq(g, $), N._42(_, N._devicePixelRatio || dg), A
			},
			toDataURL: function(f, X) {
				var O = this,
					t = O.getGL();
				if(O.validate(), f) {
					var n = t.getParameter(t.COLOR_CLEAR_VALUE);
					qq(t, f)
				}
				O._42(_, 1);
				var g = O._canvas.toDataURL(X || "image/png", 1);
				return f && qq(t, n), O._42(_, O._devicePixelRatio || dg), g
			},
			getGL: function() {
				var t = this,
					p = t._26I,
					I = t._prg;
				if(!p) try {
					t._2O = {}, p = t._26I = t._canvas.getContext("webgl", t._attributes) || t._canvas.getContext("experimental-webgl", t._attributes), p._emptyTexture = gb(p), p._emptyBlendTexture = gb(p), p._bufPool = [], p._id = ++Tf, t._buffer = {
						vs: Tl(p),
						ns: Tl(p),
						is: Tl(p),
						uv: Tl(p),
						batchColor: Tl(p),
						batchBlend: Tl(p),
						batchBrightness: Tl(p),
						lineDistance: Tl(p)
					}, t._1O = Lk(p);
					var m = t._cube = {
						vs: Tl(p),
						ns: Tl(p),
						is: Tl(p),
						uv: Tl(p)
					};
					og(p, m.vs, wj), og(p, m.ns, Ad), og(p, m.uv, vo), Ap(p, m.is, js)
				} catch(F) {}
				if(p && !I) {
					if(I = t._prg = p.createProgram(), !I) return _;
					var w = t._dirs.length,
						C = t._spots.length,
						H = t._59O.length,
						L = ["uPMatrix", "uMVMatrix", "uNMatrix", "uViewMatrix", "aNormal", "aUv", "uOffsetScale", "uDiffuse", "uBlend", "uBlendColor", "uBrightness", "uPartOpacity", "uAlphaTest", "uTransparent", "uTexture", "uBlendTexture", "uSampler", "uBlendSampler", "uDiscardSelectable", "uFix", "uPick", "uReverseFlip", "uFixPickReverseColor", "uBatchBrightness", "aBatchBrightness", "uBatchColor", "aBatchColor", "uBatchBlend", "aBatchBlend", "uDash", "aLineDistance", "uDashDistance", "uDashGapDistance", "uLight", "uHeadlightRange", "uHeadlightColor", "uFogColor", "uFogNear", "uFogFar"];
					w && L.push("uDirColor", "uDirDirection"), C && L.push("uSpotColor", "uSpotRange", "uSpotAngle", "uSpotExponent", "uSpotPosition", "uSpotDirection"), H && L.push("uPointColor", "uPointRange", "uPointPosition"), qq(p, [0, 0, 0, 0]), p.clearDepth(1), p.enable(p.DEPTH_TEST), p.depthFunc(p.LEQUAL), p.enable(p.BLEND), p.blendFuncSeparate(p.SRC_ALPHA, p.ONE_MINUS_SRC_ALPHA, p.ONE, p.ONE_MINUS_SRC_ALPHA), kq || (dj = Un(dj.substring(0, dj.indexOf("^#"))), ni = Un(ni), kq = !0);
					var v = ["#define MAX_DIR " + w, "#define MAX_SPOT " + C, "#define MAX_POINT " + H, t._fogDisabled ? "" : "#define FOG", t._dashDisabled ? "" : "#define DASH", t._batchColorDisabled ? "" : "#define BATCHCOLOR", t._batchBlendDisabled ? "" : "#define BATCHBLEND", t._batchBrightnessDisabled ? "" : "#define BATCHBRIGHTNESS", ""].join("\n"),
						b = si(p, I, p.VERTEX_SHADER, dj.replace("PREFIX", v)),
						K = si(p, I, p.FRAGMENT_SHADER, ni.replace("PREFIX", v));
					P ? L.push("aPosition") : (I.aPosition = 0, p.bindAttribLocation(I, 0, "aPosition")), p.linkProgram(I), L.forEach(function(Z) {
						I[Z] = /^u/.test(Z) ? p.getUniformLocation(I, Z) : p.getAttribLocation(I, Z)
					}), p.useProgram(I), p.deleteShader(b), p.deleteShader(K)
				}
				return p
			},
			getBrightness: function(W) {
				var j = W.s("brightness"),
					G = this.isSelected(W) ? W.s("select.brightness") : _;
				return j == _ ? G : G == _ ? j : j * G
			},
			getWireframe: function(W) {
				var U = W.s("wf.visible"),
					S = W.s("wf.width");
				return U === !0 || S > 0 && "selected" === U && this.isSelected(W) ? {
					color: W.s("wf.color"),
					width: S,
					"short": W.s("wf.short"),
					mat: W.s("wf.mat")
				} : void 0
			},
			_transformPointToViewSpace: function(Z) {
				var U = [Z[0], Z[1], Z[2]];
				return ph(U, this._viewMatrix), U
			},
			_transformDirectionToViewSpace: function(H, A) {
				var i = [H[0], H[1], H[2]];
				ph(i, this._viewMatrix);
				var M = A ? [A[0], A[1], A[2]] : [0, 0, 0];
				ph(M, this._viewMatrix);
				var D = M[0] - i[0],
					Y = M[1] - i[1],
					Q = M[2] - i[2],
					u = Math.sqrt(D * D + Y * Y + Q * Q);
				return u ? [D / u, Y / u, Q / u] : [D, Y, Q]
			},
			getWireframeGeometry: function(C) {
				return C.s("wf.geometry") ? {
					color: C.s("wf.color"),
					width: C.s("wf.width"),
					mat: C.s("wf.mat"),
					geometry: !0
				} : void 0
			},
			getBodyColor: function(z) {
				return z.s("body.color")
			},
			getMat: function(b) {
				return b.getMat ? b.getMat() : b.s("mat")
			},
			getFaceMat: function(p, t) {
				return p.getFaceMat ? p.getFaceMat(t) : p.s(t + ".mat")
			},
			getFaceBlend: function(m, z) {
				return m.s(z + ".blend") || m.s("all.blend")
			},
			getFaceColor: function(D, G) {
				return D.s(G + ".color") || D.s("all.color")
			},
			getFaceImage: function(l, y) {
				return l.s(y + ".image") || l.s("all.image")
			},
			getFaceBlendImage: function(e, Q) {
				return e.s(Q + ".blend.image") || e.s("all.blend.image")
			},
			getFaceDiscardSelectable: function(s, b) {
				var G = s.s(b + ".discard.selectable");
				return G == _ ? s.s("all.discard.selectable") : G
			},
			getFaceUv: function(x, T) {
				return x.s(T + ".uv") || x.s("all.uv")
			},
			getFaceUvOffset: function(e, E) {
				return e.s(E + ".uv.offset") || e.s("all.uv.offset")
			},
			getFaceUvScale: function(t, B) {
				return t.s(B + ".uv.scale") || t.s("all.uv.scale")
			},
			getFaceLight: function(s, A) {
				var Z = s.s(A + ".light");
				return Z == _ ? s.s("all.light") : Z
			},
			getFaceVisible: function(k, A) {
				var O = k.s(A + ".visible");
				return O == _ ? k.s("all.visible") : O
			},
			getFaceOpacity: function(Y, V) {
				var y = Y.s(V + ".opacity");
				return y == _ ? Y.s("all.opacity") : y
			},
			getFaceTransparent: function(B, D) {
				var b = B.s(D + ".transparent");
				return b == _ ? B.s("all.transparent") : b
			},
			getFaceReverseColor: function(r, s) {
				return r.s(s + ".reverse.color") || r.s("all.reverse.color")
			},
			getFaceReverseFlip: function(e, L) {
				var U = e.s(L + ".reverse.flip");
				return U == _ ? e.s("all.reverse.flip") : U
			},
			getFaceReverseCull: function(h, k) {
				var z = h.s(k + ".reverse.cull");
				return z == _ ? h.s("all.reverse.cull") : z
			},
			getTextureMap: function() {
				return this._2O
			},
			deleteTexture: function(o) {
				var w = this,
					R = w._2O[o];
				R && (delete w._2O[o], w.getGL().deleteTexture(R))
			},
			invalidateShape3dCachedImage: function(I) {
				var $ = I._shape3dCachedImage;
				$ && (this.getGL().deleteTexture($), delete I._shape3dCachedImage)
			},
			getTexture: function(u, q) {
				if(!u) return _;
				var z = this,
					g = z.getGL(),
					K = z._2O[u];
				if(!K) {
					var J = Ui(u);
					if(J)
						if(J.tagName) {
							if(J.dynamic) return Lk(g, J, z._1O);
							K = z._2O[u] = Lk(g, J)
						} else {
							var m = q && q.s("shape3d.image.cache");
							if(m && q._shape3dCachedImage && (K = q._shape3dCachedImage), !K) {
								var B = q && q.s("shape3d.fixSizeOnScreen"),
									U = B && B[0] > 0 ? B[0] : ui(J, q),
									d = B && B[1] > 0 ? B[1] : Hk(J, q);
								if(U >= 1 && d >= 1) {
									U *= devicePixelRatio, d *= devicePixelRatio;
									var F = Xq(U, d);
									wd(F, J, 0, 0, U, d, q, z), F.restore(), m && ql(J, q) ? (K = q._shape3dCachedImage = Lk(g, Zm, null, g.NEAREST), Zm = null) : K = Lk(g, Zm, z._1O, g.NEAREST)
								}
							}
						}
				}
				return K
			},
			redraw: function() {
				this.iv()
			},
			validateImpl: function() {
				var h = this;
				if(h._lightChanged) {
					h._lightChanged = !1;
					var K = [],
						B = [],
						I = [];
					h.dm().each(function(H) {
						if(gm(H)) {
							var j = H.s("light.type");
							j === Mo ? K.push(H) : j === vd ? B.push(H) : j === dd && I.push(H)
						}
					}), (K.length !== h._59O.length || B.length !== h._spots.length || I.length !== h._dirs.length) && ri(h), h._59O = K, h._spots = B, h._dirs = I
				}
				h._42(), h._1o.iv()
			},
			getRenderInfo: function() {
				var j = this.getGL();
				return j ? j._renderInfo : void 0
			},
			showDebugTip: function() {
				var J = this,
					C = J._debugDiv;
				if(!C) {
					C = J._debugDiv = r.createElement("div"), C.style.position = "absolute", C.style.overflow = "hidden", C.style.backgroundColor = "white", C.style.color = "black";
					var Z = J.getView();
					J._79O ? Z.insertBefore(C, J._79O) : Z.appendChild(C), J._debugTipTimerId = setInterval(function() {
						var K = J.getRenderInfo();
						if(K) {
							var l = J.getGL()._bufPool,
								N = l.length - (l._ivCount || 0),
								Y = "Draw Calls: " + K.calls + "<br/>" + "Vertices: " + K.vertices + "<br/>" + "Faces: " + K.faces + "<br/>" + "Lines: " + K.lines + "<br/>" + "Buffer Count: " + N;
							C.innerHTML = Y
						}
					}, 10)
				}
			},
			hideDebugTip: function() {
				var N = this,
					j = N._debugDiv;
				j && (delete N._debugDiv, cancelAnimationFrame(N._debugTipTimerId), delete N._debugTipTimerId, N.getView().removeChild(j))
			},
			_42: function(m, M) {
				var o = this;
				if(!o._35O && (!Hn || co(Hn))) {
					var P, g;
					m && (m instanceof bf ? g = m : P = m);
					var V = o._canvas,
						u = o.getWidth(),
						c = o.getHeight(),
						z = o.getGL(),
						J = o._prg;
					if(z) {
						if(M ? m || Mj(V, u, c, M) : (M = o._devicePixelRatio || dg, m || u === V.clientWidth && c === V.clientHeight || Mj(V, u, c, M)), z.viewport(0, 0, u * M, c * M), z._renderInfo = {
								calls: 0,
								vertices: 0,
								faces: 0,
								lines: 0,
								frame: ++o._frameId
							}, o._81O = _, z.clear(z.COLOR_BUFFER_BIT | z.DEPTH_BUFFER_BIT), Me(z, J.uBrightness, 1), Me(z, J.uOpacity, 1), Me(z, J.uPartOpacity, 1), z._picking = !!m, Me(z, J.uPick, !!m), Me(z, J.uTexture, !1), Me(z, J.uBlendTexture, !1), Me(z, J.uAlphaTest, Q.alphaTest), Me(z, J.uTransparent, !1), Me(z, J.uFix, !1), Me(z, J.uBatchColor, !1), Me(z, J.uBatchBlend, !1), Me(z, J.uBatchBrightness, !1), Me(z, J.uPMatrix, o._projectMatrix = Sn(o)), Me(z, J.uViewMatrix, Qb(o, o._7O)), o._viewMatrix = Nh(o._7O), m || (as(o, z, J), o._fogDisabled || (Me(z, J.uFogColor, o._fogColor), Me(z, J.uFogNear, o._fogNear), Me(z, J.uFogFar, o._fogFar))), fm(z, J.aPosition), fm(z, J.aNormal), pn(z, J.aUv), pn(z, J.aBatchColor), pn(z, J.aBatchBlend), pn(z, J.aBatchBrightness), pn(z, J.aLineDistance), g) {
							var h = z.getParameter(z.COLOR_CLEAR_VALUE);
							z.clearColor(0, 0, 0, 0), z.disable(z.BLEND), pn(z, J.aNormal), og(z, o._cube.vs, _, J.aPosition), Ap(z, o._cube.is), gh(g, o, vr, 0), gh(g, o, np, 6), gh(g, o, Td, 12), gh(g, o, Cp, 18), gh(g, o, Pi, 24), gh(g, o, ed, 30), fm(z, J.aNormal), qq(z, h)
						} else if(P) {
							P.value = 2;
							var h = z.getParameter(z.COLOR_CLEAR_VALUE);
							z.clearColor(0, 0, 0, 0), z.disable(z.BLEND), o._95I(z, J, P), zd(o, P), Lp(o, o._polylineModelMap, P), Lp(o, o._wireframeModelMap, P), Me(z, J.uTransparent, !0), o._95I(z, J, P, !0), zd(o, P, !0), Lp(o, o._polylineModelMap, P, !0), Lp(o, o._wireframeModelMap, P, !0), Me(z, J.uTransparent, !1), z.clear(z.DEPTH_BUFFER_BIT), o._swapLineMap(), o._95I(z, J, P, !1, !0), Lp(o, o._polylineModelMap, P), Lp(o, o._wireframeModelMap, P), o._swapLineMap(), z.disable(z.DEPTH_TEST), o._30O._42(z, J, P), z.enable(z.DEPTH_TEST), qq(z, h)
						} else z.disable(z.BLEND), o.drawSky(z, J), o._31O._42(z, J), o._95I(z, J), zd(o), Lp(o, o._polylineModelMap), Lp(o, o._wireframeModelMap), z.enable(z.BLEND), Me(z, J.uTransparent, !0), z.depthMask(!1), o._95I(z, J, _, !0), zd(o, _, !0), Lp(o, o._polylineModelMap, _, !0), Lp(o, o._wireframeModelMap, _, !0), z.depthMask(!0), Me(z, J.uTransparent, !1), z.clear(z.DEPTH_BUFFER_BIT), o._swapLineMap(), o._95I(z, J, _, !1, !0), Lp(o, o._polylineModelMap), Lp(o, o._wireframeModelMap), o._swapLineMap(), z.disable(z.DEPTH_TEST), z.disable(z.BLEND), o._32O._42(z, J), o._30O._42(z, J), z.enable(z.DEPTH_TEST);
						og(z, _), Ap(z, _), o._33Q = !1, o._doBufferGC(z)
					}
				}
			},
			setBufferGCInterval: function(Q) {
				this._bufferGCInterval = Q
			},
			_doBufferGC: function(J, U) {
				var F = J._bufPool,
					h = F.length;
				if(h) {
					var m, W, x = J._renderInfo.frame,
						r = this._bufferGCInterval || 10,
						t = 0;
					for(m = 0; h > m; m++) W = F[m], W ? (U || x - W._fid > r) && (t++, J.deleteBuffer(W._buf), W._buf = null, F[m] = null) : t++;
					if(t > h / 2 && t > 128) {
						var z = [];
						for(m = 0; h > m; m++) F[m] && z.push(F[m]);
						J._bufPool = z
					} else F._ivCount = t
				}
			},
			_swapLineMap: function() {
				var A = this;
				D = A._polylineModelMap, A._polylineModelMap = A._polylineModelMapSwap, A._polylineModelMapSwap = D, D = A._wireframeModelMap, A._wireframeModelMap = A._wireframeModelMapSwap, A._wireframeModelMapSwap = D, D = A._polylineIndexMap, A._polylineIndexMap = A._polylineIndexMapSwap, A._polylineIndexMapSwap = D, D = A._wireframeIndexMap, A._wireframeIndexMap = A._wireframeIndexMapSwap, A._wireframeIndexMapSwap = D
			},
			_updateSkyBoxPosition: function(U) {
				if(this._skyBox && U && "eye" === U.property) {
					var o = U.newValue;
					this._skyBox.p3(o[0], o[1], o[2]), this.invalidateData(this._skyBox)
				}
			},
			setSkyBox: function(k) {
				this._skyBox = k, this.ump(this._updateSkyBoxPosition, this), this.invalidateAll(), k && (this.mp(this._updateSkyBoxPosition, this), this._updateSkyBoxPosition())
			},
			drawSky: function(k, b, v) {
				var t = this,
					B = t._skyBox;
				if(B) {
					var h = t._headlightIntensity,
						l = Qq(t._headlightColor),
						b = t._prg;
					1 !== h && (l = [l[0] * h, l[1] * h, l[2] * h]), Me(k, b.uHeadlightColor, [l[0], l[1], l[2], 1]);
					var K = t.getData3dUI(B);
					K && K._42(k, b, v, function() {
						return !0
					}), k.clear(k.DEPTH_BUFFER_BIT), Me(k, b.uHeadlightColor, [l[0], l[1], l[2], t._headlightDisabled ? 1 : 0])
				}
			},
			_95I: function(l, B, I, K, c) {
				function Q(n) {
					if(!!n.s("shape3d.alwaysOnTop") == !!c && g.isVisible(n) && (!e || w)) {
						if(!I && g.isTransparentMask(n)) return;
						var S = g.getData3dUI(n);
						S && S._42(l, B, I, o)
					}
				}
				var g = this,
					o = function(M) {
						return K ? M : !M
					};
				g.sky && l.clear(l.DEPTH_BUFFER_BIT), g.dm().each(Q)
			},
			getLogicalPoint: function(j) {
				return qg(j, this._canvas)
			},
			getHitFaceInfo: function(i) {
				i.target && (i = this.lp(i));
				var J = this.getDataInfoAt(i);
				if(J) {
					var f = this._1o.face(J.data, Ye(i.x, i.y));
					if(f) return {
						data: J.data,
						face: f
					}
				}
				return _
			},
			unproject: function($, e) {
				var D = this,
					m = D.getWidth(),
					B = D.getHeight(),
					Q = $.target ? D.lp($) : $,
					A = Q.x - m / 2,
					C = Q.y - B / 2,
					S = 2 * (A / m),
					u = 2 * (-1 * C / B);
				e = e || 0;
				var J = Wh(),
					l = Sn(D),
					t = Qb(D);
				Zl(J, l, t), Gn(J);
				var y = Mn([S, u, e, 1], J);
				return [y[0] / y[3], y[1] / y[3], y[2] / y[3]]
			},
			getDataAt: function(P) {
				var m = this.getDataInfoAt(P);
				return m ? m.data : _
			},
			getDataInfoAt: function(p, Q) {
				return p.target && (p = this.lp(p)), this._1o.get(Ye(p.x, p.y, Q), !0)
			},
			getDatasInRect: function(C) {
				return this._1o.get(C)
			},
			setEditable: function(E) {
				var d = this,
					z = d._editable;
				d._editable = E, this.fp(uf, z, E)
			},
			isEditable: function(P) {
				var z = this;
				return z._editable ? mm(P) ? P.s("3d.editable") ? z._editableFunc ? z._editableFunc(P) : !0 : !1 : !1 : !1
			},
			isSelectable: function(t) {
				return t.s("3d.selectable") && this.sm().isSelectable(t)
			},
			isMovable: function(o) {
				var k = this;
				return Tk(o) && o.getStyle(rb) !== re ? !1 : o.s("3d.movable") ? k._movableFunc ? k._movableFunc(o) : !0 : !1
			},
			isSizeEditable: function(F) {
				return mm(F) ? this._sizeEditableFunc ? this._sizeEditableFunc(F) : !0 : !1
			},
			isRotationEditable: function(l) {
				return mm(l) && l.IRotatable !== !1 ? this._rotationEditableFunc ? this._rotationEditableFunc(l) : !0 : !1
			},
			handleDelete: function() {
				this._editable && this.removeSelection()
			},
			zoomIn: function(D) {
				this.setZoom(Tn, D)
			},
			zoomOut: function(s) {
				this.setZoom(1 / Tn, s)
			},
			getSqrt: function(A, a = [0, 0, 0]) {
				return Math.sqrt(Math.pow(A[0] - a[0], 2) + Math.pow(A[1] - a[1], 2) + Math.pow(A[2] - a[2], 2));
			},
			setZoom: function(n, I) {
				if(1 !== n) {
					var v = this;
					if(v._ortho) return v.setOrthoZoom(n, I), void 0;
					v._14o && v._14o.stop(!0);
					var E = 1 / n,
						W = v._eye,
						P = v._center,
						J = P[0] + (W[0] - P[0]) * E - W[0],
						g = P[1] + (W[1] - P[1]) * E - W[1],
						L = P[2] + (W[2] - P[2]) * E - W[2];
					if(!(uh(W, P) < v._moveStep && 1 > E)) {
						if(I = Vg(I)) {
							var w = sq(W);
							return I.action = function(G) {
								v.fi({
									kind: v._zooming ? "betweenZoom" : "beginZoom"
								}), v._zooming = 1, W[0] = w[0] + J * G, W[1] = w[1] + g * G, W[2] = w[2] + L * G, v.fp(Bc, _, W)
							}, I._37o = function() {
								delete v._14o, delete v._zooming, v.fi({
									kind: "endZoom"
								}), v.onZoomEnded()
							}, v._14o = Ai(I)
						}
						var w = [W[0] + J, W[1] + g, W[2] + L],
							sqrt = v.getSqrt(P, w);
						if(sqrt < 5600 && sqrt > 1400 && W[1] + g > 360) {
							W[0] += J, W[1] += g, W[2] += L, v.fp(Bc, _, W);
						}
					}
				}
			},
			setOrthoZoom: function(G, z) {
				if(1 !== G) {
					var T = this;
					T._14o && T._14o.stop(!0);
					var l = T._orthoWidth,
						V = l / G - l;
					if(!(l < T._moveStep && G > 1)) return(z = Vg(z)) ? (z.action = function(X) {
						T.fi({
							kind: T._zooming ? "betweenZoom" : "beginZoom"
						}), T._zooming = 1, T.setOrthoWidth(l + V * X)
					}, z._37o = function() {
						delete T._14o, delete T._zooming, T.fi({
							kind: "endZoom"
						}), T.onZoomEnded()
					}, T._14o = Ai(z)) : (T.setOrthoWidth(l / G), void 0)
				}
			},
			getPositionInfo: function(Y) {
				var q = this,
					K = q._eye,
					p = q._center,
					u = q.getAspect(),
					$ = Y ? Yg(Jn(p, K, !0), Jn(Y, K)) : uh(K, p);
				if(q._ortho) {
					var E = q._orthoWidth;
					return {
						length: $,
						height: E / u,
						width: E
					}
				}
				var I = 2 * l(q._fovy / 2) * $;
				return {
					length: $,
					height: I,
					width: I * u
				}
			},
			getCenterInfo: function() {
				var e = this;
				return e._81O || (e._81O = e.getPositionInfo()), sq(e._81O)
			},
			rotate: function(e, W, H, Z) {
				var b = this;
				if(e || W) {
					Z == _ && (Z = b._firstPersonMode), b._88O && b._88O.stop(!0);
					var X = b._center,
						w = b._eye,
						E = b.getCenterInfo().length,
						u = Z ? X : w,
						B = Z ? w : X,
						q = Jn(u, B),
						D = c(q[0], q[2]),
						R = c(n(q[0] * q[0] + q[2] * q[2]), q[1]),
						I = Z ? Hf : Bc;
					return Z && (W = -W), (H = Vg(H)) ? (H.action = function(h) {
						b.fi({
							kind: b._rotating ? "betweenRotate" : "beginRotate"
						}), b._rotating = 1;
						var j = D + e * h,
							c = R + W * h;
						c = Po(c), q[0] = E * L(c) * L(j), q[1] = E * s(c), q[2] = E * L(c) * s(j), u[0] = B[0] + q[0], u[1] = B[1] + q[1], u[2] = B[2] + q[2], b.fp(I, _, u)
					}, H._37o = function() {
						delete b._88O, delete b._rotating, b.fi({
							kind: "endRotate"
						}), b.onRotateEnded()
					}, b._88O = Ai(H)) : (D += e, R += W, R = Po(R),
						q[0] = E * L(R) * L(D),
						q[1] = E * s(R),
						q[2] = E * L(R) * s(D),
						(b.getSqrt(q) > 1400 && b.getSqrt(q) < 5600 && B[1] + q[1] > 360) ? (
							u[0] = B[0] + q[0],
							u[1] = B[1] + q[1],
							u[2] = B[2] + q[2],
							b.fp(I, _, u)
						) : null,
						void 0)
				}
			},
			pan: function(x, F, A, Z) {
				if(x || F) {
					var R = this;
					Z == _ && (Z = R._firstPersonMode), R._89O && R._89O.stop(!0);
					var q = Qb(R),
						E = [q[0] * x, q[4] * x, q[8] * x],
						J = [q[1] * F, q[5] * F, q[9] * F],
						D = E[0] + J[0],
						P = E[1] + J[1],
						c = E[2] + J[2],
						d = R._center,
						U = R._eye;
					if(Z) {
						var b = Le(R.getBoundaries(), U[0], U[2], U[0] + D, U[2] + c, n(D * D + c * c));
						D = b[0], c = b[1]
					}
					if(A = Vg(A)) {
						var T = sq(U),
							N = sq(d);
						return A.action = function(H) {
							R.fi({
								kind: R._panning ? "betweenPan" : "beginPan"
							}), R._panning = 1, d[0] = N[0] + D * H, d[1] = N[1] + P * H, d[2] = N[2] + c * H, U[0] = T[0] + D * H, U[1] = T[1] + P * H, U[2] = T[2] + c * H, R.fp(Bc, _, U), R.fp(Hf, _, d)
						}, A._37o = function() {
							delete R._89O, delete R._panning, R.fi({
								kind: "endPan"
							}), R.onPanEnded()
						}, R._89O = Ai(A)
					}
					var sqrt = R.getSqrt(d, U);
					// sqrtc = R.getSqrt(d);
					// if(sqrt < 5600 && sqrt > 1400 && U[1] + P > 360 && sqrtc < 2000) {
					if(sqrt < 5600 && sqrt > 1400 && U[1] + P > 360) {
						d[0] += D,
							d[1] += P,
							d[2] += c,
							U[0] += D,
							U[1] += P,
							U[2] += c,
							R.fp(Bc, _, U),
							R.fp(Hf, _, d) // console.log(U + "\n" + d +"\n" + sqrtc)
					}
				}
			},
			walk: function(t, E, M) {
				if(t) {
					var y = this;
					M == _ && (M = y._firstPersonMode), y._90O && y._90O.stop(!0);
					var B = y._center,
						F = y._eye,
						S = Jn(B, F, !0);
					if(M) {
						var f = Le(y.getBoundaries(), F[0], F[2], F[0] + S[0] * t, F[2] + S[2] * t, d(t));
						if(t = uh(f), !t) return;
						S = [f[0] / t, 0, f[1] / t]
					}
					if(E = Vg(E)) {
						var K = sq(F),
							D = sq(B);
						return E.action = function(T) {
							y.fi({
								kind: y._walking ? "betweenWalk" : "beginWalk"
							}), y._walking = 1;
							var c = t * T;
							F[0] = K[0] + S[0] * c, F[1] = K[1] + S[1] * c, F[2] = K[2] + S[2] * c, B[0] = D[0] + S[0] * c, B[1] = D[1] + S[1] * c, B[2] = D[2] + S[2] * c, y.fp(Bc, _, F), y.fp(Hf, _, B)
						}, E._37o = function() {
							delete y._90O, delete y._walking, y.fi({
								kind: "endWalk"
							}), y.onWalkEnded()
						}, y._90O = Ai(E)
					}
					F[0] += S[0] * t, F[1] += S[1] * t, F[2] += S[2] * t, B[0] += S[0] * t, B[1] += S[1] * t, B[2] += S[2] * t, y.fp(Bc, _, F), y.fp(Hf, _, B)
				}
			},
			handleScroll: function(g, R) {
				g.preventDefault();
				var B = this,
					K = B._moveStep;
				B.isFirstPersonMode() ? B.isPannable() && B.pan(0, R > 0 ? K : -K) : B.isZoomable() && B.setZoom(0 > R ? 1 / Ll : Ll)
			},
			handlePinch: function(M, H) {
				this.isZoomable() && this.setZoom(H > M ? 1 / bs : bs)
			},
			reset: function() {
				this.setCenter(h.graph3dViewCenter), this.setEye(h.graph3dViewEye), this.setUp(h.graph3dViewUp)
			},
			moveSelection: function(G, z, L) {
				var S = this;
				S.dm().beginTransaction(), zj(this.sm().toSelection(this.isMovable, this), G, z, L), S.dm().endTransaction()
			},
			getMoveMode: function(a, f) {
				var N = f.s("3d.move.mode");
				if(N) return N;
				var _ = "88",
					V = "89",
					z = "90";
				return Tm(a) || oi[_] && oi[V] && oi[z] ? "xyz" : oi[_] && oi[V] ? "xy" : oi[_] && oi[z] ? "xz" : oi[V] && oi[z] ? "yz" : oi[_] ? "x" : oi[V] ? "y" : oi[z] ? "z" : "xz"
			},
			handleTick: function() {
				var W = this,
					E = !1,
					a = W._moveStep,
					T = a,
					A = !1,
					e = !0,
					p = W._rotateStep * (e ? -1 : 1);
				if(W.isWalkable() || (T = 0), W.isPannable() || (a = 0), W.isRotatable() || (p = 0), W._32Q) {
					var t = (Bk() - W._32Q) / 50;
					T *= t, a *= t, p *= t
				}
				W._31Q && (Oi(W._31Q), delete W._31Q, delete W._32Q), zr() && (E = !0, W.pan(-a, 0, A, e)), Je() && (E = !0, W.pan(a, 0, A, e)), Ij() && (E = !0, Tm() ? W.pan(0, a, A, e) : W.walk(T, A, e)), Cb() && (E = !0, Tm() ? W.pan(0, -a, A, e) : W.walk(-T, A, e)), pi() && (E = !0, W.rotate(-p, 0, A, e)), lb() && (E = !0, W.rotate(p, 0, A, e)), xm() && (E = !0, W.rotate(0, -p / 2, A, e)), Qh() && (E = !0, W.rotate(0, p / 2, A, e)), E && (W._32Q = Bk(), W._31Q = Ec(W.handleTick, W))
			},
			handleKeyDown: function(I) {
				var T = this;
				!Sj(I) && ys[I.keyCode] ? T.handleTick() : pq(I) ? T.selectAll() : Hg(I) ? T.handleDelete(I) : ec(I) && this.isResettable() && T.reset()
			},
			checkDoubleClickOnNote: function(w, $, H) {
				var g = this;
				if(H === ef) {
					if($.s("note.toggleable")) return $.s(cp, !$.s(cp)), g.fi({
						kind: "toggleNote",
						event: w,
						data: $,
						part: H
					}), !0
				} else if(H === hf && $.s("note2.toggleable")) return $.s(sl, !$.s(sl)), g.fi({
					kind: "toggleNote2",
					event: w,
					data: $,
					part: H
				}), !0;
				return !1
			},
			checkDoubleClickOnRotation: function(D, O, m) {
				return m === fl ? (O.setRotationX(0), !0) : m === Zc ? (O.setRotationY(0), !0) : m === yl ? (O.setRotationZ(0), !0) : !1
			},
			onRotateEnded: function() {},
			onWalkEnded: function() {},
			toViewPosition: function(L) {
				var i = this,
					X = i.getWidth() / 2,
					W = i.getHeight() / 2,
					v = i._18Q;
				return v && v._wh === X / W || (v = Sn(i), i._18Q = Zl(v, v, Qb(i)), i._18Q._wh !== X / W), L = Mn([L[0], L[1], L[2], 1], v), {
					x: X + X * L[0] / L[3],
					y: W - W * L[1] / L[3]
				}
			},
			getHitPosition: function(s, H, l) {
				var a = this,
					B = a.getWidth(),
					w = a.getHeight(),
					e = s.target ? a.lp(s) : s,
					y = e.x - B / 2,
					h = e.y - w / 2,
					Z = a.getCenterInfo(),
					c = Qb(a);
				H = H ? H : [0, 0, 0], l = l ? l : [0, 1, 0], y = y / B * Z.width, h = -1 * h / w * Z.height;
				var M = [c[0] * y, c[4] * y, c[8] * y],
					Y = [c[1] * h, c[5] * h, c[9] * h],
					F = [M[0] + Y[0], M[1] + Y[1], M[2] + Y[2]],
					d = a.getCenter(),
					o = pb(a, H, l, [F[0] + d[0], F[1] + d[1], F[2] + d[2]]);
				return o ? o : [0, 0, 0]
			},
			getLineLength: function(P) {
				this.validate();
				var Z = this.getData3dUI(P);
				if(Z && Z.getCache) {
					var Y = Z.getCache();
					if(Y) return Y[Y.length - 1].length
				}
				return 0
			},
			getLineOffset: function(X, y) {
				var r = this.getData3dUI(X);
				if(r && r.getCache) {
					var U = r.getCache();
					if(U) return Nj(U, y)
				}
				return _
			},
			isLabelVisible: function() {
				return !0
			},
			isNoteVisible: function() {
				return !0
			}
		});
		var Fj = qe.Interactor = function(o) {
			this.gv = o
		};
		ch("Interactor", f, {
			ms_listener: 1,
			getView: function() {
				return this.gv.getView()
			},
			setUp: function() {
				this.addListeners()
			},
			tearDown: function() {
				this.removeListeners()
			}
		});
		var _e = qe.DefaultInteractor = function(n) {
			wp(_e, this, [n])
		};
		ch("DefaultInteractor", Fj, {
			handle_contextmenu: function(P) {
				Aj(P)
			},
			handle_mousewheel: function(v) {
				this.gv.handleScroll(v, v.wheelDelta / 40)
			},
			handle_DOMMouseScroll: function(s) {
				2 === s.axis && this.gv.handleScroll(s, -s.detail)
			},
			handle_keydown: function(T) {
				this.gv.handleKeyDown(T)
			},
			handle_mousedown: function(t) {
				this.handle_touchstart(t)
			},
			handle_touchstart: function(r) {
				Aj(r);
				var R = this,
					P = R.gv,
					S = Ln(r),
					i = P.getDataInfoAt(r),
					u = i ? i.data : _,
					U = i ? i.part : _,
					Q = P.sm(),
					G = gc(r),
					x = _g(r);
				P.setFocus(r) && (R._62O = _, R._57I = _, u ? Sj(r) ? Q.co(u) ? Q.rs(u) : Q.as(u) : Q.co(u) || Q.ss(u) : S && (Sj(r) ? P.isRectSelectable() && (R._62O = Lj) : R._57I = Br(r)), R._31Q && (Oi(R._31Q), delete R._31Q, delete R._32Q), R._62O || (P.isFirstPersonMode() && (Tm(r) || x > 2 ? R._62O = "pan" : P.isMouseRoamable() || k ? (R._62O = "roaming", R.foward = G && Ln(r), R._32Q = Bk(), R._31Q = Ec(R.tick, R)) : S || (R._62O = "roaming")), R._62O || (S && G && Dm[U] ? (R._62O = U, R.p3 = u.p3()) : S && G && mm(u) && P.isSelected(u) && P.isMovable(u) ? (R._62O = "move", R.p3 = u.p3(), R.movedata = u) : k && (x > 2 ? R._62O = "pan" : 2 === x && (R.dist = Ie(r), R._62O = "pinch")))), R.point = P.lp(r), ti(R, r), Jm(r) ? P.handleDoubleClick(r, u, U) : P.handleClick(r, u, U))
			},
			tick: function() {
				var l = this,
					$ = l.gv,
					T = $._moveStep;
				l.point && $.isWalkable() && (l._32Q && (T *= (Bk() - l._32Q) / 50), $.walk(l.foward ? T : -T), l._32Q = Bk(), l._31Q = Ec(l.tick, l))
			},
			handle_mouseup: function(T) {
				this.handle_touchend(T)
			},
			handle_touchend: function(o) {
				var v = this._57I;
				v && (uh(v, Br(o)) <= 1 && this.gv.sm().cs(), this._57I = _)
			},
			handleWindowMouseMove: function(Z) {
				this.handleWindowTouchMove(Z)
			},
			handleWindowTouchMove: function(o) {
				var L, D, I = this,
					Q = I.gv,
					M = I._62O,
					B = I.point,
					m = Q.dm(),
					h = Q.lp(o),
					w = h.x - B.x,
					K = h.y - B.y,
					T = -Z * w / Q.getWidth(),
					R = -Z * K / Q.getHeight();
				if("roaming" === M) I.rotate(o, T / 2, R / 2);
				else if(M === fl || M === Zc || M === yl) Q._86O || m.beginTransaction(), Q.fi({
					kind: Q._86O ? "betweenEditRotation" : "beginEditRotation",
					event: o
				}), Q._86O = 1, Q.sm().each(function(i) {
					if(mm(i) && Q.isRotationEditable(i)) {
						var j = d(T) > d(R) ? T : R;
						M === fl ? i.setRotationX(i.getRotationX() + j) : M === Zc ? i.setRotationY(i.getRotationY() + j) : M === yl && i.setRotationZ(i.getRotationZ() + j)
					}
				});
				else if("move" === M || Dm[M]) {
					M === Hb || M === Gi || M === gp ? (Q._87O || m.beginTransaction(), Q.fi({
						kind: Q._87O ? "betweenEditSize" : "beginEditSize",
						event: o
					}), Q._87O = 1) : (Q._moving || m.beginTransaction(), Q.fi({
						kind: Q._moving ? "betweenMove" : "beginMove",
						event: o
					}), Q._moving = 1);
					var f, F = I.p3,
						b = Q.getPositionInfo(F),
						j = Qb(Q);
					f = M === Od ? "x" : M === wg ? "y" : M === ur ? "z" : M === Hb ? "sx" : M === Gi ? "sy" : M === gp ? "sz" : Q.getMoveMode(o, I.movedata), w = w / Q.getWidth() * b.width, K = -1 * K / Q.getHeight() * b.height;
					var A, e, G = [j[0] * w, j[4] * w, j[8] * w],
						P = [j[1] * K, j[5] * K, j[9] * K],
						y = G[0] + P[0],
						z = G[1] + P[1],
						x = G[2] + P[2],
						p = [F[0] + y, F[1] + z, F[2] + x],
						g = Jn(Q.getEye(), p, !0);
					if("xyz" === f ? (A = p, Q.moveSelection(y, z, x)) : "xz" === f ? (A = pb(Q, F, [0, 1, 0], p), A && Q.moveSelection(A[0] - F[0], 0, A[2] - F[2])) : "xy" === f ? (A = pb(Q, F, [0, 0, 1], p), A && Q.moveSelection(A[0] - F[0], A[1] - F[1], 0)) : "yz" === f ? (A = pb(Q, F, [1, 0, 0], p), A && Q.moveSelection(0, A[1] - F[1], A[2] - F[2])) : "x" === f || "sx" === f ? (g[0] = 0, A = pb(Q, F, g, p), A && (e = A[0] - F[0], "x" === f ? Q.moveSelection(e, 0, 0) : Q.sm().each(function(m) {
							mm(m) && Q.isSizeEditable(m) && (L = N(Rc, m.getWidth() + e), D = L / m.getWidth(), m.setWidth(L), Tm(o) && (m.setHeight(m.getHeight() * D), m.setTall(m.getTall() * D)))
						}))) : "y" === f || "sy" === f ? (g[1] = 0, A = pb(Q, F, g, p), A && (e = A[1] - F[1], "y" === f ? Q.moveSelection(0, e, 0) : Q.sm().each(function(Y) {
							mm(Y) && Q.isSizeEditable(Y) && (L = N(Rc, Y.getTall() + e), D = L / Y.getTall(), Y.setTall(L), Tm(o) && (Y.setHeight(Y.getHeight() * D), Y.setWidth(Y.getWidth() * D)))
						}))) : ("z" === f || "sz" === f) && (g[2] = 0, A = pb(Q, F, g, p), A && (e = A[2] - F[2], "z" === f ? Q.moveSelection(0, 0, e) : Q.sm().each(function(n) {
							mm(n) && Q.isSizeEditable(n) && (L = N(Rc, n.getHeight() + e), D = L / n.getHeight(), n.setHeight(L), Tm(o) && (n.setTall(n.getTall() * D), n.setWidth(n.getWidth() * D)))
						}))), !A) return;
					I.p3 = A
				} else if(M === Lj) {
					var u = I.div;
					u || (u = I.div = ff(), Yb(I.getView(), u), u.op = B, u.style.background = Q.getRectSelectBackground()), Q.fi({
						kind: Q._rectSelecting ? "betweenRectSelect" : "beginRectSelect",
						event: o
					}), Q._rectSelecting = 1, u.rect = kl(u.op, h), Pm(u, u.rect)
				} else if("pinch" === M && 2 === _g(o)) {
					Q.fi({
						kind: Q._pinching ? "betweenPinch" : "beginPinch",
						event: o
					}), Q._pinching = 1;
					var e = Ie(o);
					Q.handlePinch(e, I.dist), I.dist = e
				} else "pan" === M || Tm(o) ? I.pan(o, w, K) : Q.isFirstPersonMode() || (Ln(o) ? I.rotate(o, T, R) : (I.pan(o, w, 0), Q.isWalkable() && (Q.fi({
					kind: Q._walking ? "betweenWalk" : "beginWalk",
					event: o
				}), Q._walking = 1, Q.walk(K / Q.getHeight() * Q.getCenterInfo().height))));
				I.point = h
			},
			pan: function(K, A, T) {
				var Y = this.gv;
				if(Y.isPannable()) {
					var S = Y.getCenterInfo(),
						d = A / Y.getWidth() * S.width,
						N = -1 * T / Y.getHeight() * S.height;
					Y.fi({
						kind: Y._panning ? "betweenPan" : "beginPan",
						event: K
					}), Y._panning = 1, Y.pan(-d, -N)
				}
			},
			rotate: function(C, M, W) {
				var z = this.gv;
				z.isRotatable() && (z.fi({
					kind: z._rotating ? "betweenRotate" : "beginRotate",
					event: C
				}), z._rotating = 1, z.rotate(M, W))
			},
			handleWindowMouseUp: function(q) {
				this.handleWindowTouchEnd(q)
			},
			handleWindowTouchEnd: function(D) {
				var U = this,
					l = U.gv,
					Z = l.dm(),
					R = U.div;
				if(R) {
					var N = l.getDatasInRect(R.rect);
					if(!N.isEmpty()) {
						var J = l.sm(),
							V = J.toSelection();
						N.each(function(f) {
							J.co(f) ? V.remove(f) : V.add(f)
						}), J.ss(V)
					}
					Cj(R)
				}
				l._moving && (delete l._moving, l.fi({
					kind: "endMove",
					event: D
				}), l.onMoveEnded(), Z.endTransaction()), l._panning && (delete l._panning, l.fi({
					kind: "endPan",
					event: D
				}), l.onPanEnded()), l._rotating && (delete l._rotating, l.fi({
					kind: "endRotate",
					event: D
				}), l.onRotateEnded()), l._86O && (delete l._86O, l.fi({
					kind: "endEditRotation",
					event: D
				}), Z.endTransaction()), l._87O && (delete l._87O, l.fi({
					kind: "endEditSize",
					event: D
				}), Z.endTransaction()), l._pinching && (delete l._pinching, l.fi({
					kind: "endPinch",
					event: D
				}), l.onPinchEnded()), l._rectSelecting && (delete l._rectSelecting, l.fi({
					kind: "endRectSelect",
					event: D
				}), l.onRectSelectEnded()), l._walking && (delete l._walking, l.fi({
					kind: "endWalk",
					event: D
				}), l.onWalkEnded()), U.dist = U.point = U._62O = U.p3 = U.movedata = U.div = U._57I = U._32Q = U._31Q = U.foward = _
			}
		});
		var Qo = function(M) {
			this.gv = M
		};
		xh(Qo, f, {
			_iv: !0,
			iv: function() {
				this._iv = !0
			},
			face: function(G, A) {
				var Y = this,
					H = Y.gv.getGL();
				if(!H || !mm(G)) return _;
				var u = A.x,
					r = A.width,
					f = A.height,
					N = Y.height - A.y - f,
					p = X(r / 2),
					U = new Uint8Array(4 * r * f),
					o = 0;
				for(Y.iv(), Y.validate(G), ai(H, Y.frame), H.readPixels(u, N, r, f, H.RGBA, H.UNSIGNED_BYTE, U), ai(H, _), Y.iv(); p >= o; o++)
					for(var B = p - o, e = p + o, s = B; e >= s; s++)
						for(var O = B; e >= O; O++)
							if(s === B || s === e || O === B || O === e) {
								var M = Io.m[U[4 * (s * r + O)]];
								if(M) return M
							}
			},
			get: function(B, Y) {
				this.validate();
				var z = this,
					T = z.gv.getGL();
				if(!T) return _;
				var L, g, P = B.x,
					r = B.width,
					q = B.height,
					K = z.height - B.y - q,
					p = X(r / 2),
					A = new Uint8Array(4 * r * q),
					x = 0,
					o = A.length,
					M = Y ? _ : new ag,
					y = Y ? _ : {};
				if(ai(T, z.frame), T.readPixels(P, K, r, q, T.RGBA, T.UNSIGNED_BYTE, A), ai(T, _), Y) {
					for(; p >= x; x++)
						for(var m = p - x, d = p + x, l = m; d >= l; l++)
							for(var h = m; d >= h; h++)
								if((l === m || l === d || h === m || h === d) && (L = z.info(A, 4 * (l * r + h)))) return L
				} else
					for(; o > x; x += 4) L = z.info(A, x), L && (g = L.data, y[g._id] || (M.add(g), y[g._id] = g));
				return M
			},
			info: function(x, o) {
				return this.colorMap[(x[o] << 16) + (x[o + 1] << 8) + x[o + 2] + ((127 & x[o + 3]) << 24)]
			},
			validate: function(j) {
				var U = this,
					k = U.gv,
					S = k.getGL();
				if(S) {
					var m = k.getWidth(),
						t = k.getHeight(),
						G = S.RGBA,
						r = S.TEXTURE_2D,
						C = S.RENDERBUFFER,
						y = S.FRAMEBUFFER;
					U.texture || (U.texture = Lk(S), U.render = S.createRenderbuffer(), U.frame = S.createFramebuffer()), (U.width !== m || U.height !== t) && (yj(S, U.texture), S.texImage2D(r, 0, G, m, t, 0, G, S.UNSIGNED_BYTE, _), pj(S, S.TEXTURE_MIN_FILTER, S.LINEAR), S.bindRenderbuffer(C, U.render), S.renderbufferStorage(C, S.DEPTH_COMPONENT16, m, t), ai(S, U.frame), S.framebufferTexture2D(y, S.COLOR_ATTACHMENT0, r, U.texture, 0), S.framebufferRenderbuffer(y, S.DEPTH_ATTACHMENT, C, U.render), yj(S, _), S.bindRenderbuffer(C, _), ai(S, _), U.width = m, U.height = t), U._iv && (U._iv = !1, ai(S, U.frame), k._42(j || (U.colorMap = {}), 1), ai(S, _))
				}
			}
		});
		var Jq = function(w) {
			this.gv = w
		};
		xh(Jq, f, {
			gap: 0,
			size: 0,
			_42: function(w, W) {
				var S = this,
					F = S.gv,
					l = F._gridGap,
					T = F._gridSize;
				if(F._gridVisible) {
					if(S.gap !== l || S.size !== T) {
						for(var m = [], C = F._gridSize / 2, t = l * C, j = 0; 2 * C + 1 > j; j++) {
							var E = 6 * j,
								N = 6 * (2 * C + 1) + E;
							m[E] = -t, m[E + 1] = 0, m[E + 2] = -t + j * l, m[E + 3] = t, m[E + 4] = 0, m[E + 5] = -t + j * l, m[N] = -t + j * l, m[N + 1] = 0, m[N + 2] = -t, m[N + 3] = -t + j * l, m[N + 4] = 0, m[N + 5] = t
						}
						S.vs = new Km(m), S.gap = l, S.size = T
					}
					Jd(F), Zp(w, W), Em(w), Ib(w, W, 1, F._gridColor, F._buffer.vs, S.vs), Zf(w, 0, S.vs.length / 3, w.LINES), Tp(w), sj(w, W)
				} else S.vs = S.gap = S.size = _
			}
		});
		var Ee = function(P) {
			this.gv = P
		};
		xh(Ee, f, {
			_42: function(J, E) {
				var g = this.gv,
					n = g._buffer.vs,
					u = g._axisXColor,
					H = g._axisYColor,
					d = g._axisZColor,
					k = g._originAxisVisible,
					h = g._centerAxisVisible;
				if(k || h) {
					var T = P ? J.TRIANGLES : J.TRIANGLE_FAN,
						D = J.LINES;
					if(Jd(g), Zp(J, E), Em(J), k) {
						var $ = g.getCenterInfo(),
							K = R($.width, $.height) / 5,
							m = .8 * K,
							X = .05 * K;
						Ib(J, E, 1.5, u, n, new Km([0, 0, 0, K, 0, 0, m, X, 0, m, 0, X, m, -X, 0, m, 0, -X, m, X, 0, 0, 0, 0, 0, K, 0, X, m, 0, 0, m, X, -X, m, 0, 0, m, -X, X, m, 0, 0, 0, 0, 0, 0, K, X, 0, m, 0, X, m, -X, 0, m, 0, -X, m, X, 0, m])), Zf(J, 0, 2, D), Zf(J, 1, 6, T), Ib(J, E, _, H), Zf(J, 7, 2, D), Zf(J, 8, 6, T), Ib(J, E, _, d), Zf(J, 14, 2, D), Zf(J, 15, 6, T)
					}
					if(h) {
						var C = g._center,
							V = C[0],
							B = C[1],
							v = C[2],
							$ = g.getPositionInfo(C);
						K = R($.width, $.height) / 20, Ib(J, E, 1.5, u, n, new Km([V, B, v, V + K, B, v, V, B, v, V, B + K, v, V, B, v, V, B, v + K])), Zf(J, 0, 2, D), Ib(J, E, _, H), Zf(J, 2, 2, D), Ib(J, E, _, d), Zf(J, 4, 2, D)
					}
					Tp(J), sj(J, E)
				}
			}
		});
		var wh = function(C) {
				this.gv = C
			},
			Od = "edit_tx",
			wg = "edit_ty",
			ur = "edit_tz",
			fl = "edit_rx",
			Zc = "edit_ry",
			yl = "edit_rz",
			Hb = "edit_sx",
			Gi = "edit_sy",
			gp = "edit_sz",
			Dm = {};
		Dm[Od] = 1, Dm[wg] = 1, Dm[ur] = 1, Dm[fl] = 1, Dm[Zc] = 1, Dm[yl] = 1, Dm[Hb] = 1, Dm[Gi] = 1, Dm[gp] = 1, xh(wh, f, {
			_42: function(_, D, U) {
				var r = this,
					F = r.gv,
					W = F.sm().ld();
				if(F.isEditable(W) && !F.isEditHelperDisabled() && mm(W) && (!F.isFirstPersonMode() || !F.isMouseRoamable() && !k)) {
					Jd(F);
					var S, J, a = F.isMovable(W),
						V = F.isRotationEditable(W),
						Y = F.isSizeEditable(W),
						H = F._axisXColor,
						l = F._axisYColor,
						e = F._axisZColor,
						w = F._editSizeColor,
						P = F.getCenterInfo(),
						u = R(P.width, P.height) / 10,
						L = u / (U ? 5 : 10),
						c = .7 * u,
						N = .4 * c,
						j = W.p3(),
						K = j[0],
						T = j[1],
						z = j[2];
					S = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0], a && r._17O(_, D, W, U, Od, H, S, [K, T - L, z, K + c, T - L, z, K + c, T, z, K + c, T, z, K, T, z, K, T - L, z, K, T - L, z + L, K + c, T - L, z + L, K + c, T - L, z, K + c, T - L, z, K, T - L, z, K, T - L, z + L]), J = K + c, Y && r._17O(_, D, W, U, Hb, w, S, [J, T - L, z, J + N, T - L, z, J + N, T, z, J + N, T, z, J, T, z, J, T - L, z, J, T - L, z + L, J + N, T - L, z + L, J + N, T - L, z, J + N, T - L, z, J, T - L, z, J, T - L, z + L]), J += N, V && r._17O(_, D, W, U, fl, H, S, [J, T - L, z, J + N, T - L, z, J + N, T, z, J + N, T, z, J, T, z, J, T - L, z, J, T - L, z + L, J + N, T - L, z + L, J + N, T - L, z, J + N, T - L, z, J, T - L, z, J, T - L, z + L]), S = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0], a && r._17O(_, D, W, U, wg, l, S, [K, T, z, K, T + c, z, K - L, T + c, z, K - L, T + c, z, K - L, T, z, K, T, z, K, T, z, K, T, z - L, K, T + c, z - L, K, T + c, z - L, K, T + c, z, K, T, z]), J = T + c, Y && r._17O(_, D, W, U, Gi, w, S, [K, J, z, K, J + N, z, K - L, J + N, z, K - L, J + N, z, K - L, J, z, K, J, z, K, J, z, K, J, z - L, K, J + N, z - L, K, J + N, z - L, K, J + N, z, K, J, z]), J += N, V && r._17O(_, D, W, U, Zc, l, S, [K, J, z, K, J + N, z, K - L, J + N, z, K - L, J + N, z, K - L, J, z, K, J, z, K, J, z, K, J, z - L, K, J + N, z - L, K, J + N, z - L, K, J + N, z, K, J, z]), S = [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0], a && r._17O(_, D, W, U, ur, e, S, [K, T, z, K, T, z + c, K, T - L, z + c, K, T - L, z + c, K, T - L, z, K, T, z, K, T - L, z, K - L, T - L, z, K - L, T - L, z + c, K - L, T - L, z + c, K, T - L, z + c, K, T - L, z]), J = z + c, Y && r._17O(_, D, W, U, gp, w, S, [K, T, J, K, T, J + N, K, T - L, J + N, K, T - L, J + N, K, T - L, J, K, T, J, K, T - L, J, K - L, T - L, J, K - L, T - L, J + N, K - L, T - L, J + N, K, T - L, J + N, K, T - L, J]), J += N, V && r._17O(_, D, W, U, yl, e, S, [K, T, J, K, T, J + N, K, T - L, J + N, K, T - L, J + N, K, T - L, J, K, T, J, K, T - L, J, K - L, T - L, J, K - L, T - L, J + N, K - L, T - L, J + N, K, T - L, J + N, K, T - L, J])
				}
			},
			_17O: function(g, m, A, b, w, I, r, K) {
				var d = this.gv._buffer;
				yb(g, m, b, !0, A, w), dq(g, m, _, !0, _, !0, _, !1), Me(g, m.uDiffuse, I), og(g, d.vs, new Km(K), m.aPosition), og(g, d.ns, new Km(r), m.aNormal), Em(g), Zf(g, 0, 12), Tp(g), md(g, m)
			}
		});
		var Zh = function(N, M) {
			this.gv = N, this.s = function(C, u, x) {
				return u == _ && (u = x), u == _ ? M.getStyle(C) : Vo(u, M, N)
			}, this.data = M
		};
		xh(Zh, f, {
			I3d: !0,
			ms_icons: 1,
			_iv: !0,
			iv: function() {
				this._iv = !0
			},
			_42: function(A, R, c, x) {
				var j = this,
					r = j.data;
				if(!(r instanceof es)) {
					var E, T, S, t, D, C, P, e = j.gv,
						K = r._id,
						h = j.s("shape3d.alwaysOnTop") ? null : j.s("batch"),
						l = e._batchIndexMap,
						u = e._batchModelMap,
						b = e.isSelectable(r),
						d = e.getBrightness(r),
						V = d != _ && 1 !== d;
					if(j.needValidate(A)) {
						if(S = kf(l, u, r, h), j.validate(S, h ? En[h] || ng : _), S && (t = l[K], D = t.size = S.vs.length / 3 - t.begin, P = S.rs))
							for(d = V ? d : 1, C = 0; D > C; C++) P.push(d);
						if(mm(r)) {
							var J = e.getWireframeGeometry(r);
							if(J) sc(e, r, J);
							else {
								var s = e.getWireframe(r);
								s && sc(e, r, s)
							}
						}
						j.labelInfo = j.label2Info = j.noteInfo = j.note2Info = j._38o = _, j._24O(Cq, "getLabel"), j._24O(ks, "getLabel2"), j._26O(ef, "getNote"), j._26O(hf, "getNote2"), j._15O(), j._iv = !1
					}
					V && Me(A, R.uBrightness, d), Me(A, R.uAlphaTest, j.s("alphaTest")), T = yb(A, R, c, b, r, Tg), T && (Hh(T, l[K], u), Hh(T, e._polylineIndexMap[K], e._polylineModelMap), Hh(T, e._wireframeIndexMap[K], e._wireframeModelMap)), l[K] || j._80o(A, R, x), e.isLabelVisible(r) && ((E = j.labelInfo) && (yb(A, R, c, b, r, Cq), j._28O(E, Cq, x)), (E = j.label2Info) && (yb(A, R, c, b, r, ks), j._28O(E, ks, x))), e.isNoteVisible(r) && ((E = j.noteInfo) && (yb(A, R, c, b, r, ef), j._29O(E, ef, x)), (E = j.note2Info) && (yb(A, R, c, b, r, hf), j._29O(E, hf, x))), (E = j._38o) && j._99O(A, R, E, c, b, x), V && Me(A, R.uBrightness, 1)
				}
			},
			needValidate: function() {
				return this._iv
			},
			validate: function() {},
			_16O: function() {
				return Pd
			},
			_80o: function() {},
			dispose: function() {},
			_calcAnchorMat: function(v) {
				if(v.hasOwnProperty("_anchor") || v.hasOwnProperty("_anchorElevation")) {
					var N = v.getAnchor3d(),
						j = {
							x: N.x - .5,
							y: N.y - .5,
							z: N.z - .5
						},
						z = Wh();
					return lg(z, [-j.x, -j.y, -j.z]), z
				}
			},
			getBodyColor: function(R) {
				var r = this.data,
					i = this.gv.getBodyColor(r);
				return i ? i : R ? r.getStyle(R) : _
			},
			_24O: function(u, j) {
				var B = this,
					P = B.data,
					A = B.gv,
					R = B.s,
					f = A[j](P);
				if(f != _) {
					var X = R(u + ".scale"),
						H = R(u + ".max"),
						r = B[u + "Info"] = {
							label: f,
							textureScale: R(u + ".texture.scale"),
							color: A[j + "Color"](P),
							font: R(u + ".font"),
							align: R(u + ".align"),
							background: A[j + "Background"](P)
						},
						V = r.rect = tg(r, f);
					H > 0 && H < V.width && (r.labelWidth = V.width, V.width = H), V.x = V.y = 0, V.width *= X, V.height *= X, r.mat = B._16O(R(u + ".autorotate"), R(u + ".position"), V, R(u + ".face"), R(u + ".t3"), R(u + ".r3"), R(u + ".rotationMode"));
					var S = V.width / 2,
						q = V.height / 2;
					r.vs = new Km([-S, q, 0, -S, -q, 0, S, -q, 0, S, q, 0]), V.width /= X, V.height /= X
				}
			},
			_26O: function(P, d) {
				var J = this,
					k = J.data,
					j = J.gv,
					G = J.s,
					Y = j[d](k);
				if(Y != _) {
					var m = G(P + ".scale"),
						x = this[P + "Info"] = {
							note: Y,
							textureScale: G(P + ".texture.scale"),
							expanded: G(P + ".expanded"),
							font: G(P + ".font"),
							color: G(P + ".color"),
							align: G(P + ".align"),
							borderWidth: G(P + ".border.width"),
							borderColor: G(P + ".border.color"),
							background: j[d + "Background"](k)
						};
					if(x.expanded) {
						var o = G(P + ".max"),
							V = tg(x, Y);
						V.width += 6, V.height += 2, o > 0 && o < V.width && (x.labelWidth = V.width, V.width = o);
						var $ = {
							x: -V.width / 2,
							y: -8 - V.height,
							width: V.width,
							height: V.height + 8
						}
					} else $ = {
						x: -6,
						y: -18,
						width: 12,
						height: 18
					};
					x.mat = J._16O(G(P + ".autorotate"), G(P + ".position"), _, G(P + ".face"), G(P + ".t3"), G(P + ".r3"), G(P + ".rotationMode")), x.rect = $, 1 !== m && ($ = sq($), $.x *= m, $.height *= m, $.y = -$.height, $.width *= m);
					var i = $.x,
						B = $.y,
						R = $.width,
						g = $.height;
					x.vs = new Km([i, -B, 0, i, -B - g, 0, i + R, -B - g, 0, i + R, -B, 0])
				}
			},
			_28O: function(e, N, h) {
				if(h(this.s(N + ".transparent"))) {
					var Y = e.rect,
						t = e.textureScale,
						w = Y.width * t,
						X = Y.height * t;
					if(w >= 1 && X >= 1) {
						var s = Xq(w, X);
						1 !== t && (s.translate(s, Y.x, Y.y), s.scale(t, t), s.translate(s, -Y.x, -Y.y)), $j(s, e), s.restore(), $d(this, N, e.mat, e.vs, !0)
					}
				}
			},
			_29O: function(g, _, E) {
				if(E(this.s(_ + ".transparent"))) {
					var m = g.rect,
						R = g.textureScale,
						f = m.x,
						F = m.y,
						l = m.width * R,
						t = m.height * R;
					if(l >= 1 && t >= 1) {
						m.x = m.y = 0;
						var d = Xq(l, t);
						1 !== R && d.scale(R, R), Sf(d, g), d.restore(), m.x = f, m.y = F, $d(this, _, g.mat, g.vs, !1)
					}
				}
			},
			_99O: function(E, l, q, k, O, N) {
				if(q) {
					var t = this,
						r = t.gv,
						R = t.data,
						V = r._buffer,
						F = r._1O,
						m = q.icons;
					for(var T in m) {
						var Q = m[T],
							g = q.rects[T];
						if(g && N(Vo(Q.transparent, R, r))) {
							yb(E, l, k, O, R, T);
							var J = Vo(Q.shape3d, R, r),
								M = J ? [J] : Vo(Q.names, R, r),
								e = M ? M.length : 0,
								P = Vo(Q.textureScale, R, r) || 1,
								v = Vo(Q.light, R, r);
							v == _ && (v = J ? !0 : !1), dq(E, l, Vo(Q.blend, R, r), v, Vo(Q.opacity, R, r), Vo(Q.reverseFlip, R, r), Vo(Q.reverseColor, R, r), Vo(Q.reverseCull, R, r));
							for(var X = 0; e > X; X++) {
								var C = M[X],
									h = g[X];
								if(Pc(t, h.mat), J) le(r, R, Qg(t, J), t);
								else {
									var w = Ui(C);
									if(w) {
										var b = h.width * P,
											i = h.height * P;
										if(b >= 1 && i >= 1) {
											var c = Xq(b, i);
											yq(c, w, Vo(Q.stretch, R, r), 0, 0, b, i, R, r), c.restore(), Lk(E, Zm, F), Em(E, l, F, Vo(Q.discardSelectable, R, r), V.uv, qm), og(E, V.vs, h.vs, l.aPosition), vg(E, V.ns, zi, l.aNormal), sk(E, V.is, Qr), zc(E, 0, Qr.length), Tp(E, l, F)
										}
									}
								}
								Qk(r)
							}
							md(E, l)
						}
					}
				}
			}
		});
		var Xo = function(S, o) {
			wp(Xo, this, [S, o])
		};
		xh(Xo, Zh, {
			_16O: function(_, U, c, Z, E, W, m, j, v) {
				var t = this.data,
					G = t.getFinalScale3d(),
					L = Iq(U, G, c, Z, j, v);
				if(t.hasOwnProperty("_anchor") || t.hasOwnProperty("_anchorElevation")) {
					var N = t.getAnchor3d();
					L[0] -= (N.x - .5) * G[0], L[1] -= (N.y - .5) * G[1], L[2] -= (N.z - .5) * G[2]
				}
				return Oq(Wh(), L, t.p3(), Z, E, W, m, _, t.r3(), t.getRotationMode())
			},
			clear: function() {
				var E = this;
				E.faceMat = E.mat = E.shapeModel = E.left = E.right = E.front = E.back = E.top = E.bottom = E.csg = _
			},
			needValidate: function(D) {
				if(this._iv) return this._validateFrameId = D._renderInfo.frame, !0;
				if(this.s("shape3d.autorotate") || this.s("shape3d.fixSizeOnScreen")) {
					var f = D._renderInfo.frame;
					if(this._validateFrameId !== f) return this._validateFrameId = f, !0
				}
				return !1
			},
			validate: function(q, y) {
				var m = this,
					z = m.gv,
					$ = m.data,
					W = Qg(m);
				m._updateAutoRotation(), m._updateFixSize2d(), (this.s("shape3d.autorotate") || this.s("shape3d.fixSizeOnScreen")) && (Ld(z, $, "_wireframeModelMap", "_wireframeIndexMap"), Ld(z, $, "_wireframeModelMapSwap", "_wireframeIndexMapSwap"));
				var A = el($, z.getMat($), W ? m.s("shape3d.scaleable") : !0),
					N = m._calcAnchorMat($);
				if(N && Zl(A, A, N), m.clear(), q) {
					var _ = [];
					W ? Gh(z, $, W, m, m.getBodyColor(), [A], q, _) : (Cg(z, $, q, y, A, vr, _, zk), Cg(z, $, q, y, A, Td, _, ts), Cg(z, $, q, y, A, Pi, _, Lf), Cg(z, $, q, y, A, ed, _, Jp), Cg(z, $, q, y, A, np, _, Vq), Cg(z, $, q, y, A, Cp, _, Cc)), _.length && (Fo(q.vs, _), Fo(q.ns, ic(_)))
				} else m.mat = A, (m.shapeModel = W) || (m._cubeUvs = null, m.vf(vr, 0), m.vf(Td, 16), m.vf(np, 8), m.vf(Cp, 24), m.vf(Pi, 32), m.vf(ed, 40))
			},
			_updateAutoRotation: function() {
				var v = this,
					A = v.s("shape3d.autorotate");
				if(A) {
					var r, O = v.gv,
						p = v.data;
					r = "string" == typeof A ? [A.indexOf("x") < 0 ? O._eye[0] : O._center[0], A.indexOf("y") < 0 ? O._eye[1] : O._center[1], A.indexOf("z") < 0 ? O._eye[2] : O._center[2]] : O._eye;
					var E = O._center,
						R = [r[0] - E[0], r[1] - E[1], r[2] - E[2]],
						e = p.p3(),
						F = Uh([e[0] + R[0], e[1] + R[1], e[2] + R[2]], e, O._up),
						G = p.r3(),
						i = Gf(F, p.getRotationMode());
					Math.abs(G[0] - i[0]) < 1e-5 && Math.abs(G[1] - i[1]) < 1e-5 && Math.abs(G[2] - i[2]) < 1e-5 || p.r3(i)
				}
			},
			_updateFixSize2d: function() {
				var C = this,
					f = C.data,
					u = C.s("shape3d.fixSizeOnScreen");
				if(!u) return f._dynamicScale3d && delete f._dynamicScale3d, void 0;
				var Q = C.gv;
				f.getFinalScale3d();
				var x = el(f, Q.getMat(f)),
					t = ph([0, 0, 0], x),
					d = Q.toViewPosition(t);
				if(!isNaN(d.x) && !isNaN(d.y)) {
					var V = ph([1, 0, 0], x),
						G = Q.toViewPosition(V),
						h = ph([0, 1, 0], x),
						W = Q.toViewPosition(h),
						T = G.x - d.x,
						B = W.y - d.y,
						e = f._dynamicScale3d || [1, 1, 1],
						v = Ui(f.s("shape3d.image")),
						M = u[0] > 0 ? u[0] : v ? ui(v, C) : 20,
						N = u[1] > 0 ? u[1] : v ? Hk(v, C) : 20,
						E = Math.abs(T / M),
						I = Math.abs(B / N);
					Math.abs(E - 1) < .001 && Math.abs(I - 1) < .001 || (f._dynamicScale3d = [e[0] / E, e[1] / I, e[2]])
				}
			},
			vf: function(q, x) {
				var c = this;
				if(c.gv.getFaceVisible(c.data, q)) {
					var v = Ag(c, q);
					v.mat && (c.faceMat = !0);
					var V = v.uv;
					if(V) {
						var Y = c._cubeUvs;
						Y || (Y = c._cubeUvs = new Km([0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0]));
						for(var j = 0; 8 > j; j++) Y[x + j] = V[j]
					}
					return v
				}
			},
			_80o: function(d, $, M) {
				var H = this,
					A = H.gv,
					G = H.data,
					X = A._cube,
					j = H.shapeModel;
				Jd(A, H.mat), j ? le(A, G, j, H, H.getBodyColor(), M) : (og(d, X.vs, _, $.aPosition), og(d, X.ns, _, $.aNormal), Ap(d, X.is), H._18O(d, $, H.left, 0, M), H._18O(d, $, H.front, 6, M), H._18O(d, $, H.right, 12, M), H._18O(d, $, H.back, 18, M), H._18O(d, $, H.top, 24, M), H._18O(d, $, H.bottom, 30, M)), Qk(A), H.faceMat && (H._18O(d, $, H.left, 0, M, !0), H._18O(d, $, H.front, 6, M, !0), H._18O(d, $, H.right, 12, M, !0), H._18O(d, $, H.back, 18, M, !0), H._18O(d, $, H.top, 24, M, !0), H._18O(d, $, H.bottom, 30, M, !0))
			},
			_18O: function(G, v, T, c, j, n) {
				if(T) {
					if(!j(T.transparent)) return;
					if(n && !T.mat || !n && T.mat) return;
					n && Jd(this.gv, T.mat);
					var q = this,
						b = q.data,
						A = q.gv,
						I = A.getTexture(T.texture, b),
						C = T.uv,
						K = T.uvScale,
						k = T.uvOffset,
						N = T.discardSelectable;
					I ? C ? Em(G, v, I, N, A._buffer.uv, q._cubeUvs, k, K) : Em(G, v, I, N, A._cube.uv, _, k, K) : Em(G), dq(G, v, T.blend, T.light, T.opacity, T.reverseFlip, T.reverseColor, T.reverseCull), Me(G, v.uDiffuse, T.color), zc(G, c, 6), md(G, v), Tp(G, v, I), n && Qk(A)
				}
			}
		});
		var qh = function(I, a) {
			wp(qh, this, [I, a])
		};
		xh(qh, Zh, {
			_25Q: 1,
			validate: function(r) {
				var m = this,
					y = m.gv,
					T = m.data,
					n = m.s,
					H = n("edge.width"),
					k = T._40I,
					g = T._41I;
				if(m.shapeModel = m.info = _, k && g) {
					var $, B, u, N, L, Z, Q, I, A, W, s = T.isLooped(),
						e = n(rb),
						p = h.getEdgeType(e);
					if(p) {
						var O = p(T, ac(m, y, T, s, e), y, m._19Q);
						if(!O.points || O.points.isEmpty()) return;
						Z = m.info = {}, Q = O.segments, L = O.points, I = L.size();
						for(var K = k.getElevation(), l = g.getElevation(), d = 0; I > d; d++) {
							var P = L.get(d);
							P.e == _ && (P.e = K + (l - K) * d / (I - 1))
						}
						A = nk(L.get(0)), W = nk(L.get(I - 1));
						var F = I % 2;
						0 === F ? (Z.c1 = nk(L.get(I / 2 - 1)), Z.c2 = nk(L.get(I / 2))) : Z.p3 = nk(L.get((I - F) / 2)), Z.s1 = A, Z.s2 = nk(L.get(1)), Z.t1 = nk(L.get(I - 2)), Z.t2 = W
					} else {
						L = new ag, Z = m.info = {};
						var z = n("edge.offset"),
							b = n("edge.center"),
							G = n("edge.source.t3"),
							f = n("edge.target.t3"),
							x = k.p3(),
							M = g.p3();
						if(G && (x[0] += G[0], x[1] += G[1], x[2] += G[2]), f && (M[0] += f[0], M[1] += f[1], M[2] += f[2]), e === re) {
							Q = n("edge.segments");
							var V = Z.points = n(tq) || Op;
							if(I = V.size()) {
								A = nk(V.get(0)), W = nk(V.get(I - 1)), !b && z && (u = Jn(A, x, !0), z = R(z, uh(x, A)), x = [x[0] + u[0] * z, x[1] + u[1] * z, x[2] + u[2] * z], u = Jn(M, W, !0), z = R(z, uh(W, M)), M = [M[0] - u[0] * z, M[1] - u[1] * z, M[2] - u[2] * z]);
								var F = I % 2;
								0 === F ? ($ = nk(V.get(I / 2 - 1)), B = nk(V.get(I / 2))) : Z.p3 = nk(V.get((I - F) / 2)), Z.s1 = x, Z.s2 = A, Z.t1 = W, Z.t2 = M
							} else !b && z && (u = Jn(M, x, !0), N = uh(x, M), z = ug(z, N), x = [x[0] + u[0] * z, x[1] + u[1] * z, x[2] + u[2] * z], M = [M[0] - u[0] * z, M[1] - u[1] * z, M[2] - u[2] * z]), $ = x, B = M;
							L.add({
								x: x[0],
								y: x[2],
								e: x[1]
							}), L.addAll(V), L.add({
								x: M[0],
								y: M[2],
								e: M[1]
							})
						} else {
							var J = ac(m, y, T, s, e);
							if(m._19Q || (J = -J), s) {
								var w = x[0],
									i = x[1],
									U = x[2],
									D = k.getTall() / 2 + J;
								$ = [w - J, i + D, U], B = [w + J, i + D, U], L.add({
									x: w - J,
									y: U,
									e: i
								}), L.add({
									x: w - J,
									y: U,
									e: i + D
								}), L.add({
									x: w + J,
									y: U,
									e: i + D
								}), L.add({
									x: w + J,
									y: U,
									e: i
								})
							} else {
								u = Jn(M, x, !0), N = uh(x, M);
								var c = {
										x: x[0],
										y: x[2]
									},
									X = {
										x: M[0],
										y: M[2]
									},
									C = Kc(_, c, X, J),
									q = C.x - c.x,
									v = C.y - c.y;
								z = ug(z, N), u[0] *= z, u[1] *= z, u[2] *= z, $ = [x[0] + u[0] + q, x[1] + u[1], x[2] + u[2] + v], B = [M[0] - u[0] + q, M[1] - u[1], M[2] - u[2] + v], b ? (L.add({
									x: x[0],
									y: x[2],
									e: x[1]
								}), L.add({
									x: $[0],
									y: $[2],
									e: $[1]
								}), L.add({
									x: B[0],
									y: B[2],
									e: B[1]
								}), L.add({
									x: M[0],
									y: M[2],
									e: M[1]
								})) : (L.add({
									x: $[0],
									y: $[2],
									e: $[1]
								}), L.add({
									x: B[0],
									y: B[2],
									e: B[1]
								}))
							}
						}
						Z.c1 = $, Z.c2 = B
					}
					Z.list = n(jp) === Kn ? m.createTubeModel(L, Q, H / 2, r) : m.createLineModel(L, Q, H, "edge", "edge.dash")
				}
			}
		});
		var Wp = function(s, v) {
			wp(Wp, this, [s, v])
		};
		xh(Wp, Xo, {
			_80o: function(T, o, B) {
				var Q = this,
					r = Q.gv,
					R = Q.shapeModel;
				Jd(r, Q.mat), R ? le(r, Q.data, R, Q, Q.getBodyColor(), B) : (Rb(Q, T, o, Q.left, B), Rb(Q, T, o, Q.front, B), Rb(Q, T, o, Q.right, B), Rb(Q, T, o, Q.back, B), Rb(Q, T, o, Q.top, B), Rb(Q, T, o, Q.bottom, B)), Qk(r)
			},
			validate: function(V, o) {
				var M, K, T = this,
					R = T.s,
					c = T.data,
					Q = c.p3(),
					u = c._thickness / 2,
					W = c.isClosePath(),
					e = c.getPoints(),
					L = c.getSegments(),
					U = R(Md),
					Z = V && V.uv;
				if(T.clear(), 0 > u) K = T.shapeModel = wf(e, L, R(nn), R(tb), U, R(Eh), c.getTall(), c.getShapeElevation(), W), R(Sd) ? R("shape3d.image") || delete K.uv : (delete K.vs, delete K.ns, delete K.uv), R("shape3d.top.image") || delete K.top_uv, R("shape3d.bottom.image") || delete K.bottom_uv;
				else if(R(jp) === Kn) M = Lh(e, L, U, W), K = T.shapeModel = {
					vs: []
				}, R("shape3d.image") && (K.uv = [], K.sum = R(Eh) || pg(M) || 1, K.len = 0), R(nn) && !W && (K.top_vs = [], R("shape3d.top.image") && (K.top_uv = [])), R(tb) && !W && (K.bottom_vs = [], R("shape3d.bottom.image") && (K.bottom_uv = [])), T._12O(M, u);
				else {
					var D, b, r, N, a, t, m, y, f, G;
					if(M = Lh(e, L, U, W), a = T.vf(np, Z, !1, o), u && (t = T.vf(Cp, Z, !1, o), m = W ? _ : T.vf(vr, Z, !1, o), y = W ? _ : T.vf(Td, Z, !1, o), f = T.vf(Pi, Z, !1, o), G = T.vf(ed, Z, !1, o)), u) {
						for(var p = 0, I = M.length; I > p; p++) M[p] = T._tryRemoveBezierPoints(M[p], u);
						T._12O(M, u)
					} else a && M.forEach(function(j) {
						if(N = j.length, N > 0)
							for(D = j[0], r = 1; N > r; r++) b = j[r], T.addV(a.vs, D, b), D = b
					});
					T._20Q(M), V || (a && (a.ns = ic(a.vs), Bj(a, "vs"), Bj(a, $h)), u && (t && (t.ns = ic(t.vs), Bj(t, "vs"), Bj(t, $h)), m && (m.ns = ic(m.vs), Bj(m, "vs"), Bj(m, $h)), y && (y.ns = ic(y.vs), Bj(y, "vs"), Bj(y, $h)), f && (f.ns = ic(f.vs), Bj(f, "vs"), Bj(f, $h)), G && (G.ns = ic(G.vs), Bj(G, "vs"), Bj(G, $h))))
				}
				var w = T.mat = Wh();
				lg(w, Q), Dl(w, c.r3(), c.getRotationMode());
				var h = c.getScale3d(),
					q = c._dynamicScale3d;
				q && (h[0] *= q[0], h[1] *= q[1], h[2] *= q[2]), Tc(w, h), lg(w, to(Q)), V && (pd(T, w, V, K), T.clear())
			},
			_20Q: function(I) {
				var S, Q, i, H, f, n, R, Y = this,
					O = Y.front,
					L = Y.back,
					w = Y.top,
					h = Y.bottom,
					o = O ? O.tuv : _,
					e = L ? L.tuv : _,
					T = w ? w.tuv : _,
					c = h ? h.tuv : _,
					k = 0;
				(o || e || T || c) && (S = Y.s(Eh) || pg(I) || 1, I.forEach(function(U) {
					if(Q = U.length, Q > 0)
						for(n = U[0], i = 1; Q > i; i++) R = U[i], H = k / S, k += uh(n, R), f = k / S, Y._14O(O, H, f), Y._14O(L, 1 - f, 1 - H), Y._14O(w, H, f), Y._14O(h, H, f), n = R
				}))
			},
			_14O: function(r, $, y) {
				if(r) {
					var C = r.uv,
						D = r.tuv;
					if(D) {
						if(C) var h = C[0] + (C[6] - C[0]) * $,
							j = C[1] + (C[7] - C[1]) * $,
							W = C[2] + (C[4] - C[2]) * $,
							b = C[3] + (C[5] - C[3]) * $,
							I = C[2] + (C[4] - C[2]) * y,
							e = C[3] + (C[5] - C[3]) * y,
							u = C[0] + (C[6] - C[0]) * y,
							V = C[1] + (C[7] - C[1]) * y;
						else h = $, j = 0, W = $, b = 1, I = y, e = 1, u = y, V = 0;
						D.push(W, b, I, e, u, V, u, V, h, j, W, b)
					}
				}
			},
			_13O: function(p) {
				var J = p.uv,
					Z = p.tuv;
				Z && (J ? Z.push(J[2], J[3], J[4], J[5], J[6], J[7], J[6], J[7], J[0], J[1], J[2], J[3]) : Z.push(0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1))
			},
			_tryRemoveBezierPoints: function(D, b) {
				var v = D.length;
				if(4 > v) return D;
				var m, U, y, p, x, R, H = !1,
					o = function(W) {
						return D[W]
					},
					I = function(V) {
						return D[v - 1 - V]
					};
				for(x = 0; 1 >= x; x++)
					for(R = x ? I : o, U = R(0), y = R(1), m = 2; v - 1 > m; m++)
						if(p = R(m), !p.remove)
							if(p.b) {
								var W = Kc(U, y, p, b);
								W.adjust ? (p.remove = !0, H = !0) : (U = y, y = p)
							} else U = y, y = p;
				if(!H) return D;
				var l = [];
				for(m = 0; v > m; m++) D[m].remove || l.push(D[m]);
				return l
			},
			_12O: function(Y, i) {
				var b, R, W, K, k, v = this;
				Y.forEach(function(A) {
					if(k = A.length, k > 0)
						for(b = {
								p: A[0],
								n: !0
							}, K = 1; k > K; K++) R = A[K], W = k - 1 > K ? A[K + 1] : _, v.addPoint(b, R, W, i, A)
				})
			},
			addPoint: function(S, A, j, c, n) {
				var H, R, o, D, Y, s, C, k, Z, M = this,
					p = S.p,
					F = S.f,
					P = S.b,
					b = M.s("shape3d.side") || Jo,
					r = M.s("shape3d.start.angle"),
					h = M.s("shape3d.sweep.angle"),
					f = M.shapeModel,
					y = M.data.isClosePath();
				if(S.n && (S.n = !1, F = y && n.length > 2 ? Kc(n[n.length - 2], p, A, c) : Kc(_, p, A, c), P = mi(p, F), f ? f.top_vs && M._10O(P, F, b, r, h, f.top_vs, f.top_uv) : (H = M.left) && (M.addV(H.vs, P, F), M._13O(H))), R = j ? Kc(p, A, j, c) : y && n.length > 2 ? Kc(p, A, n[1], c) : Kc(p, A, _, c), o = mi(A, R), f) {
					var d, W, l = f.vs,
						O = f.uv,
						T = f.sum;
					for(O && (d = f.len / T, f.len += uh(p, A), W = f.len / T), s = M._9O(P, F, b, r, h), C = M._9O(o, R, b, r, h), k = 0; b > k; k++) Z = k + 1, Fo(l, s[Z]), Fo(l, C[k]), Fo(l, s[k]), Fo(l, C[k]), Fo(l, s[Z]), Fo(l, C[Z]), O && (D = k / b, Y = Z / b, O.push(d, Y, W, D, d, D, W, D, d, Y, W, Y));
					!j && f.bottom_vs && M._10O(o, R, b, r, h, f.bottom_vs, f.bottom_uv, !0)
				} else !j && (H = M.right) && (M.addV(H.vs, R, o), M._13O(H)), (H = M.front) && M.addV(H.vs, F, R), (H = M.back) && M.addV(H.vs, o, P), (H = M.top) && M.addH(H.vs, F, R, o, P, !0), (H = M.bottom) && M.addH(H.vs, P, o, R, F);
				S.p = A, S.f = R, S.b = o
			},
			_10O: function(x, k, W, g, j, T, v, w) {
				var d, z, F = this,
					A = F.data,
					e = F._9O(x, k, W, g, j),
					m = (x.x + k.x) / 2,
					X = (x.y + k.y) / 2,
					o = A.getShapeElevation(),
					u = 0;
				for(u = 0; W > u; u++) w ? (Fo(T, e[u]), Fo(T, e[u + 1])) : (Fo(T, e[u + 1]), Fo(T, e[u])), Fo(T, [m, o, X]), v && (w ? (d = Z * (u + 1) / W + g, z = Z * u / W + g) : (d = Z * u / W + g, z = Z * (u + 1) / W + g), v.push(.5 - .5 * s(z), .5 - .5 * L(z), .5 - .5 * s(d), .5 - .5 * L(d), .5, .5))
			},
			_9O: function(a, m, y, Q, T) {
				var C, z, I = this,
					q = I.data,
					k = [],
					b = (a.x + m.x) / 2,
					r = (a.y + m.y) / 2,
					i = q.getTall() / 2,
					x = q.getShapeElevation(),
					l = 0;
				for(T = T || Z; y >= l; l++) C = T * l / y + Q, z = s(C), k.push([b + (a.x - b) * z, x + i * L(C), r + (a.y - r) * z]);
				return k
			},
			addV: function(k, z, Z) {
				var a = z.x,
					S = z.y,
					d = Z.x,
					u = Z.y,
					I = this.data,
					c = I.getShapeElevation(),
					B = I.getTall() / 2;
				k.push(a, c - B, S, d, c - B, u, d, c + B, u, d, c + B, u, a, c + B, S, a, c - B, S)
			},
			addH: function(y, s, d, Y, E, S) {
				var h = this.data,
					U = h.getTall() / 2,
					z = h.getShapeElevation() + (S ? U : -U);
				y.push(s.x, z, s.y, d.x, z, d.y, Y.x, z, Y.y, Y.x, z, Y.y, E.x, z, E.y, s.x, z, s.y)
			},
			vf: function(P, K, i, B) {
				var W, f = this,
					a = f.gv.getFaceVisible(f.data, P);
				return(i || a) && (W = Ag(f, P, B), W.vs = [], W.tuv = a && (W.texture || K) ? [] : _, W.visible = a), W
			}
		});
		var on = function(m, _) {
			wp(on, this, [m, _])
		};
		xh(on, Zh, {
			_25Q: 1,
			validate: function(E) {
				var g = this,
					q = g.data,
					a = g.s,
					H = q.getPoints(),
					T = H.size();
				if(g.shapeModel = g.info = _, T > 1) {
					var Z = g.info = {},
						c = q.getSegments(),
						h = q.getThickness(),
						C = nk(H.get(0)),
						W = nk(H.get(T - 1)),
						k = T % 2;
					0 === k ? (Z.c1 = nk(H.get(T / 2 - 1)), Z.c2 = nk(H.get(T / 2))) : Z.p3 = nk(H.get((T - k) / 2)), Z.s1 = C, Z.s2 = nk(H.get(1)), Z.t1 = nk(H.get(T - 2)), Z.t2 = W, Z.list = a(jp) === Kn ? g.createTubeModel(H, c, h / 2, E) : g.createLineModel(H, c, h, "shape.border", "shape.dash")
				}
				var p = q.p3(),
					D = g.mat = Wh();
				lg(D, p), Dl(D, q.r3(), q.getRotationMode());
				var l = q.getScale3d(),
					O = q._dynamicScale3d;
				O && (l[0] *= O[0], l[1] *= O[1], l[2] *= O[2]), Tc(D, l), lg(D, to(p))
			},
			_80o: function(Y, e, O) {
				var B = this,
					W = B.shapeModel;
				if(W) {
					var m = B.gv;
					Jd(m, B.mat), le(m, B.data, W, B, B.getBodyColor(), O), Qk(m)
				}
			}
		}), yi(h, {
			accordionViewExpandIcon: Lg(zh),
			accordionViewCollapseIcon: Lg(zh, !0),
			accordionViewLabelColor: rf,
			accordionViewLabelFont: sf,
			accordionViewTitleBackground: no,
			accordionViewSelectBackground: om,
			accordionViewSelectWidth: 3,
			accordionViewSeparatorColor: S,
			splitViewDividerSize: 1,
			splitViewDividerBackground: no,
			splitViewDragOpacity: .5,
			splitViewToggleIcon: {
				width: 16,
				height: 16,
				comps: [{
					type: wk,
					rect: [2, 2, 12, 12],
					background: zh
				}]
			},
			propertyViewLabelColor: jr,
			propertyViewLabelSelectColor: rf,
			propertyViewLabelFont: sf,
			propertyViewExpandIcon: Lg(fj),
			propertyViewCollapseIcon: Lg(fj, !0),
			propertyViewBackground: gl,
			propertyViewRowLineVisible: !0,
			propertyViewColumnLineVisible: !0,
			propertyViewRowLineColor: bg,
			propertyViewColumnLineColor: bg,
			propertyViewSelectBackground: om,
			listViewLabelColor: jr,
			listViewLabelSelectColor: rf,
			listViewLabelFont: sf,
			listViewRowLineVisible: !1,
			listViewRowLineColor: bg,
			listViewSelectBackground: om,
			treeViewLabelColor: jr,
			treeViewLabelSelectColor: rf,
			treeViewLabelFont: sf,
			treeViewExpandIcon: Lg(Nn),
			treeViewCollapseIcon: Lg(Nn, !0),
			treeViewRowLineVisible: !1,
			treeViewRowLineColor: bg,
			treeViewSelectBackground: om,
			treeViewDoubleClickToToggle: !0,
			tableViewLabelColor: jr,
			tableViewLabelSelectColor: rf,
			tableViewLabelFont: sf,
			tableViewRowLineVisible: !0,
			tableViewColumnLineVisible: !0,
			tableViewRowLineColor: bg,
			tableViewColumnLineColor: bg,
			tableViewSelectBackground: om,
			treeTableViewLabelColor: jr,
			treeTableViewLabelSelectColor: rf,
			treeTableViewLabelFont: sf,
			treeTableViewExpandIcon: Lg(Nn),
			treeTableViewCollapseIcon: Lg(Nn, !0),
			treeTableViewRowLineVisible: !0,
			treeTableViewColumnLineVisible: !0,
			treeTableViewRowLineColor: bg,
			treeTableViewColumnLineColor: bg,
			treeTableViewSelectBackground: om,
			tableHeaderLabelColor: jr,
			tableHeaderLabelFont: sf,
			tableHeaderColumnLineVisible: !0,
			tableHeaderColumnLineColor: gs,
			tableHeaderBackground: gl,
			tableHeaderMoveBackground: yn,
			tableHeaderInsertColor: om,
			tableHeaderSortDescIcon: yk(fj, !0),
			tableHeaderSortAscIcon: yk(fj),
			tabViewTabGap: 1,
			tabViewLabelColor: rf,
			tabViewLabelFont: sf,
			tabViewTabBackground: no,
			tabViewSelectWidth: 3,
			tabViewSelectBackground: om,
			tabViewMoveBackground: yn,
			tabViewInsertColor: om,
			toolbarLabelColor: jr,
			toolbarLabelSelectColor: rf,
			toolbarLabelFont: sf,
			toolbarBackground: gl,
			toolbarSelectBackground: om,
			toolbarItemGap: 8,
			toolbarSeparatorColor: wn
		}, !0);
		var Fc = {
				translateX: 1,
				sortColumn: 1
			},
			$e = {
				sortable: 1,
				sortOrder: 1,
				sortFunc: 1
			},
			Vk = {
				focusData: 1
			},
			Dh = {
				dataModel: 1,
				sortColumn: 1,
				sortFunc: 1,
				visibleFunc: 1,
				rootData: 1,
				rootVisible: 1
			},
			ij = {
				dataModel: 1,
				sortFunc: 1,
				visibleFunc: 1,
				categorizable: 1
			},
			ls = function(v, s) {
				s.add(v), v.hasChildren() && v.eachChild(function(k) {
					ls(k, s)
				})
			},
			an = function(x, C, m, n, Y, r, s, W, H, k, b) {
				var t, p = m.getValueType(k),
					f = m.getAlign(k);
				if(m.getEnumValues(k)) {
					var j = m.toEnumLabel(C, k),
						T = ab || 0,
						L = 0,
						S = r,
						l = h.getTextSize(n, j).width;
					return t = Ui(m.toEnumIcon(C, k)), t && (L = r + ab / 2, "center" === f ? L += (W - (T + l)) / 2 : "right" === f && (L = L + W - (T + l)), Ip(x, t, L, s + H / 2, k, b), S = L + ab / 2), j != _ && (t ? ul(x, j, n, Y, S, s, W - (S - r), H) : ul(x, j, n, Y, r, s, W, H, f)), void 0
				}
				return C = m.formatValue(C), C != _ ? p === Cr ? (jo(x, r, s, W, H, C), void 0) : p === Tq || !p && Yh(C) ? (t = Ui(C ? Ek : $n), Ip(x, t, r + W / 2, s + H / 2, k, b), void 0) : (ul(x, C, n, Y, r, s, W, H, f), void 0) : void 0
			},
			Dr = function(F, V) {
				var B = V.view,
					Z = Pp(F),
					X = V.column || V.property;
				B.getDataModel().beginTransaction(), V.editor = F, F.info = V, B.setCurrentEditor(F), B.getView().insertBefore(Z, B._79O), Pm(F, V.editorRect), F.setFocus ? F.setFocus() : Hm(F), F.commitValue = function() {
					F._17Q && (F = F._17Q), B.setValue(V.data, X, F.getValue ? F.getValue() : F.value), F.close && F.close(), Cj(Z)
				}, X.onEditorCreated && X.onEditorCreated(V)
			},
			pc = function(H, z, S, m, q) {
				var J = Oh(H, S),
					M = z.value,
					d = z.view,
					K = q.getValueType(z.data);
				return J.onblur = J.onchange = function() {
					d.endEditing()
				}, "input" === H ? (M = q.formatValue(M), M != _ && (J.value = M), J.onkeydown = function(n) {
					iq(n) && d.endEditing()
				}, (K === Kd || K === en) && J.addEventListener(Ob, h.numberListener, !1)) : H === Lj && m.forEach(function(E) {
					var u = r.createElement("option");
					u.innerHTML = q.toEnumLabel(E), u.value = E, q.isEnumEqual(M, E) && (u.selected = !0), Yb(J, u)
				}), Dr(J, z), J
			},
			dc = z.widget = {},
			$k = function(u, D, G) {
				xh(m + ".widget." + u, D, G)
			};
		yi(Eq, {
			ms_value: function(u) {
				u.getValue = function($) {
					var f = this.getItemById($),
						L = f.element;
					return Ol(L) ? L : L ? L.getValue ? L.getValue() : L.value : f.selected
				}, u.setValue = function(j, M) {
					var c = this.getItemById(j),
						q = c.element;
					q && !Ol(q) ? q.setValue ? q.setValue(M) : q.value = M : Yh(M) ? (c.selected = M, this.iv()) : (c.element = M, this.iv())
				}, u.v = function(r, f) {
					var W = this;
					if(2 === arguments.length) W.setValue(r, f);
					else {
						if(!Ki(r)) return W.getValue(r);
						for(var I in r) W.setValue(I, r[I])
					}
					return W
				}
			},
			_46o: function(r) {
				r._icon = _, r._accessType = _, r._valueType = _, r._editable = !1, r._batchEditable = !0, r._align = vr, r._nullable = !0, r._emptiable = !1, r.setParent = jd, r.formatValue = function(d) {
					var S = this,
						R = S._valueType;
					return S.getEnumValues() ? S.toEnumLabel(d) : R === Tq ? !!d : d != _ && R === Kd ? g(d) : d
				}, r.setEnum = function(C, U, l, f, I, P, Q) {
					var M = this;
					C && !An(C) && C.values && (f = C.editable, l = C.icons, U = C.labels, I = C.strict, P = C.maxHeight, Q = C.dropDownWidth, C = C.values), jg(C) && (C = C._as), jg(U) && (U = U._as), jg(l) && (l = l._as), M._enumValues = C, M._enumLabels = U, M._enumIcons = l, M._enumEditable = f, M._enumStrict = I == _ ? !0 : I, M._enumMaxHeight = P, M._enumDropDownWidth = Q, C && C.length && jb(C[0]) && (M._valueType = en), M.fp("enum", !1, !0)
				}, r.getEnumDropDownWidth = function() {
					return this._enumDropDownWidth
				}, r.getEnumMaxHeight = function() {
					return this._enumMaxHeight
				}, r.isEnumEditable = function() {
					return this._enumEditable
				}, r.getEnumValues = function() {
					return this._enumValues
				}, r.getEnumLabels = function() {
					return this._enumLabels
				}, r.getEnumIcons = function() {
					return this._enumIcons
				}, r.isEnumStrict = function() {
					return this._enumStrict
				}, r.isEnumEqual = function(E, q) {
					return this._enumStrict ? E === q : E == q
				}, r.toEnumLabel = function(h, q) {
					var O = this,
						y = O.getEnumValues(q),
						v = O.getEnumLabels(q);
					if(y && v)
						for(var X = 0; X < y.length; X++)
							if(O.isEnumEqual(h, y[X])) return v[X];
					return h
				}, r.toEnumIcon = function(R, C) {
					var z = this,
						Y = z.getEnumValues(C),
						f = z.getEnumIcons(C);
					if(Y && f)
						for(var v = 0; v < Y.length; v++)
							if(z.isEnumEqual(R, Y[v])) return f[v];
					return S
				}
			},
			_45o: function(e) {
				e._87o = function(m, V, d, D, t, f) {
					if(m) {
						var v = this,
							C = v._90I,
							M = ff(1);
						v._columnLineVisible && (t -= 1), v._rowLineVisible && (f -= 1), 0 >= t || 0 >= f || (v._90I || (C = v._90I = {}), C[V] || (C[V] = new ag), Pm(M, v.tx() + d, v.ty() + D, t, f), Yb(M, m), v._view.insertBefore(M, v._79O), m.onParentAdded && m.onParentAdded(M), C[V].add(M))
					}
				}, e._76o = function() {
					var t = this,
						n = t._90I;
					if(n) {
						for(var o in n) n[o].each(function(w) {
							Cj(w)
						});
						delete t._90I
					}
				}, e._77o = function(h) {
					var Q = this;
					if(Q._90I) {
						var b = Q._90I[h];
						b && (b.each(function(A) {
							Cj(A)
						}), delete Q._90I[h])
					}
				}
			},
			_47o: function(c) {
				c.getValue = function(X, d) {
					return d.getValue ? d.getValue(X, d, this) : kp(X, d.getAccessType(), d.getName())
				}, c.setValue = function(g, B, K) {
					if(B.isEmptiable(g) || "" !== K || (K = S), B.isNullable(g) || K != _) {
						var E = this,
							G = B.getName(g),
							I = B.getAccessType(g),
							h = B.getValueType(g);
						h === Kd && Ol(K) ? K = b(K) : h === en && Ol(K) ? K = parseFloat(K) : h === Tq && Ol(K) && (K = "true" === K), E._batchEditable && B._batchEditable && E.isSelected(g) ? E.sm().each(function(M) {
							B.setValue ? B.setValue(M, B, K, E) : dh(M, I, G, K)
						}) : B.setValue ? B.setValue(g, B, K, E) : dh(g, I, G, K)
					}
				}, c.setCurrentEditor = function(p) {
					this.endEditing(), this._currentEditor = p, this.redraw()
				}, c.isEditing = function(F, s) {
					var N = this,
						L = N._currentEditor;
					if(!L) return !1;
					if(s) {
						var H = L.info;
						return H ? (H.column || H.property) === s && H.data === F : !1
					}
					return !0
				}, c.endEditing = function() {
					var W = this,
						m = W._currentEditor;
					m && (delete W._currentEditor, m.commitValue && m.commitValue(m.info), W.redraw(), W.getDataModel().endTransaction())
				}, c.beginEditing = function(R) {
					this.endEditing();
					var s = this,
						E = R.column || R.property;
					if(E.beginEditing) E.beginEditing(R);
					else {
						var L = R.data,
							S = R.value,
							X = s.getSelectBackground(L),
							Q = E.getEnumValues(L),
							Y = E.getSlider(L),
							y = E.getColorPicker(L);
						if(Y) {
							var G = Bo(dc.Slider, Y);
							return G.setValue(S), G.getView().onblur = function() {
								s.endEditing()
							}, G.isInstant() && (G.onValueChanged = function() {
								s.setValue(L, E, G.getValue())
							}), Dr(G, R), void 0
						}
						if(y || E.getValueType(L) === Cr) {
							var m = Bo(dc.ColorPicker, y);
							return m.setValue(S), m.onClosed = function() {
								s.endEditing()
							}, m.isInstant() && (m.onValueChanged = function(j, B) {
								s.setValue(L, E, B)
							}), Dr(m, R), m.open(), void 0
						}
						if(Q) {
							if(dc.ComboBox) {
								var O = new dc.ComboBox;
								O.setValue(S), O.setValues(Q), O.setLabels(E.getEnumLabels(L)), O.setIcons(E.getEnumIcons(L)), O.setEditable(E.isEnumEditable(L)), O.setStrict(E.isEnumStrict(L)), O.setMaxHeight(E.getEnumMaxHeight(L)), O.setDropDownWidth(E.getEnumDropDownWidth(L)), O.onClosed = function() {
									s.endEditing()
								}, Dr(O, R), O.open()
							} else pc(Lj, R, X, Q, E);
							return
						}
						var N = E.getValueType(L);
						if(N === Tq || Yh(S)) return s.setValue(L, E, !S), void 0;
						if(E.getItemEditor(L)) {
							var A = ms(E.getItemEditor(L)),
								l = new A(L, E, s, R),
								D = l.getView();
							return D._17Q = l, l.setValue(S), uc(D), Dr(D, R), l.editBeginning && l.editBeginning(), void 0
						}
						pc("input", R, X, _, E)
					}
				}
			},
			_44o: function(B) {
				B.init = function(M) {
					var c = this,
						l = c.th = new of (M),
						A = c._view = Co(1, c);
					c.tv = c._tableView = M, Yb(A, l.getView()), Yb(A, M.getView()), l.mp(function(e) {
						e.property === Yo && c.iv()
					}), c.iv()
				}, B.getTableView = function() {
					return this.tv
				}, B.getTableHeader = function() {
					return this.th
				}, B.getDataModel = function() {
					return this.tv.dm()
				}, B.getColumnModel = function() {
					return this.tv.getColumnModel()
				}, B.setColumns = function(G) {
					this.tv.setColumns(G)
				}, B.addColumns = function(O) {
					this.tv.addColumns(O)
				}, B.endEditing = function() {
					this.tv.endEditing()
				}, B.validateImpl = function() {
					var k = this,
						t = k.th,
						s = vl(t),
						D = {
							x: 0,
							y: 0,
							width: k.getWidth(),
							height: s
						};
					Pm(t, D), D.y = s, D.height = N(0, k.getHeight() - s), Pm(k.tv, D)
				}
			},
			ms_vs: function(G) {
				G._41o = function() {
					return this._29I.height < this._59I
				}, G._43o = function() {
					var C = this;
					C._41o() && (C._58I || (E(function() {
						C._94O()
					}, wq), C.iv()), C._58I = new Date)
				}, G._94O = function() {
					var j = this;
					if(j._58I) {
						var B = new Date;
						B.getTime() - j._58I.getTime() >= wq ? (delete j._58I, j.iv()) : E(function() {
							j._94O()
						}, wq)
					}
				}, G._93I = function() {
					var t = this,
						M = t._27I;
					if(t._58I || !t._autoHideScrollBar) {
						M || Yb(t._79O, M = t._27I = ff());
						var U = t._29I,
							K = U.height,
							d = t._59I,
							N = t.getScrollBarSize(),
							w = U.width - N - 2,
							v = K * (-t.ty() / d),
							O = K * (K / d),
							o = M.style;
						d > K ? (ee > O && (v = v + O / 2 - ee / 2, 0 > v && (v = 0), v + ee > K && (v = K - ee), O = ee), o.visibility = be, o.background = t.getScrollBarColor(), o.borderRadius = N / 2 + hh, Pm(M, w, v, N, O)) : o.visibility = Ji
					} else M && (M.style.visibility = Ji)
				}
			},
			ms_hs: function(S) {
				S._40o = function() {
					return this._29I.width < this._91I
				}, S._42o = function() {
					var $ = this;
					$._40o() && ($._95O || (E(function() {
						$._94I()
					}, wq), $.iv()), $._95O = new Date)
				}, S._94I = function() {
					var k = this;
					if(k._95O) {
						var q = new Date;
						q.getTime() - k._95O.getTime() >= wq ? (delete k._95O, k.iv()) : E(function() {
							k._94I()
						}, wq)
					}
				}, S._92I = function() {
					var D = this,
						V = D._28I;
					if(D._95O || !D._autoHideScrollBar) {
						V || Yb(D._79O, V = D._28I = ff());
						var x = D._29I,
							_ = x.width,
							n = D._91I,
							O = D.getScrollBarSize(),
							o = x.height - O - 2,
							A = _ * (-D.tx() / n),
							M = _ * (_ / n),
							w = V.style;
						n > _ ? (ee > M && (A = A + M / 2 - ee / 2, 0 > A && (A = 0), A + ee > _ && (A = _ - ee), M = ee), w.visibility = be, w.background = D.getScrollBarColor(), w.borderRadius = O / 2 + hh, Pm(V, A, o, M, O)) : w.visibility = Ji
					} else V && (V.style.visibility = Ji)
				}
			}
		}), Wi(Ek, mo(16, 16, [{
			type: Qe,
			rect: [1, 1, 14, 14],
			background: om
		}, {
			type: Zb,
			rect: [1, 1, 14, 14],
			width: 1,
			color: ub
		}, {
			type: xn,
			points: [13, 3, 7, 12, 4, 8],
			borderWidth: 2,
			borderColor: "#FFF"
		}])), Wi($n, mo(16, 16, {
			type: Zb,
			rect: [1, 1, 14, 14],
			width: 1,
			color: ub
		})), Wi(Nc, mo(16, 16, [{
			type: _c,
			rect: [2, 2, 12, 12],
			borderWidth: 1,
			borderColor: ub,
			background: "#FFF"
		}, {
			type: _c,
			rect: [4, 4, 8, 8],
			background: om
		}])), Wi(rj, mo(16, 16, {
			type: _c,
			rect: [2, 2, 12, 12],
			borderWidth: 1,
			borderColor: ub
		})), Eq._15Q = function(o) {
			o._29I = ih, o._59I = 0, o._91I = 0, o._5o = function(Q) {
				var P = this;
				P._30I = new ag, P._rows = new ag, P._rowMap = {}, P._31I = 0, P._14I = 0, P._view = Co(1, P), P._canvas = Qc(P._view), Yb(P._view, P._79O = ff()), P.dm(Q ? Q : new uk)
			}, o.getCheckIcon = function(y) {
				var B = this.sm(),
					F = B.co(y);
				return B.sg() ? Ui(F ? Nc : rj) : Ui(F ? Ek : $n)
			}, o.checkData = function(g) {
				var A = this.sm(),
					C = A.co(g);
				A.sg() && C || (this._32o = 1, C ? A.rs(g) : A.as(g), delete this._32o)
			}, o.getDataAt = function(M) {
				M.target && (M = this.lp(M));
				var p = X(M.y / this._rowHeight),
					$ = this._rows;
				return 0 > p || p >= $.size() ? _ : $.get(p)
			}, o.onDataDoubleClicked = function() {}, o.onDataClicked = function() {}, o.adjustTranslateX = function() {
				return 0
			}, o.adjustTranslateY = function(u) {
				var Q = this.getHeight() - this._59I;
				return Q > u && (u = Q), u > 0 ? 0 : g(u)
			}, o.onPropertyChanged = function(W) {
				var L = this,
					l = W.property;
				Dh[l] ? L.ivm() : Vk[l] || L.redraw(), l === zp ? L._42o() : l === Dj && L._43o()
			}, o.getLabel = function(E) {
				return E.toLabel()
			}, o.getLabelFont = function() {
				return this._labelFont
			}, o.getLabelColor = function(w) {
				var R = this;
				if(R.isCheckMode()) {
					if(R._focusData === w) return R._labelSelectColor
				} else if(R.isSelected(w)) return R._labelSelectColor;
				return R._labelColor
			}, o.getStartRowIndex = function() {
				return this._31I
			}, o.getEndRowIndex = function() {
				return this._14I
			}, o.getRowDatas = function() {
				return this._rows
			}, o.getRowIndex = function(H) {
				return this._rowMap[H._id]
			}, o.getRowSize = function() {
				return this._rows.size()
			}, o.getViewRect = function() {
				return sq(this._29I)
			}, o.isVisible = function(j) {
				return this._visibleFunc ? this._visibleFunc(j) : !0
			}, o.getCurrentSortFunc = function() {
				return this._sortFunc
			}, o.setDataModel = function(d) {
				var P = this,
					$ = P._dataModel,
					H = P._selectionModel;
				$ !== d && ($ && ($.umm(P.handleDataModelChange, P), $.umd(P.handleDataPropertyChange, P), $.umh(P.handleHierarchyChange, P), H || $.sm().ums(P.handleSelectionChange, P)), P._dataModel = d, d.mm(P.handleDataModelChange, P), d.md(P.handleDataPropertyChange, P), d.mh(P.handleHierarchyChange, P), H ? H._21I(d) : d.sm().ms(P.handleSelectionChange, P), P.fp("dataModel", $, d))
			}, o.validateModel = function() {
				var k = this;
				k._rows.clear(), k._rowMap = {}, k.buildChildren(k._dataModel._roots);
				var N = k._rows = k._rows.toList(k.isVisible, k),
					r = 0,
					u = k.getCurrentSortFunc(),
					n = N.size();
				for(u && N.sort(u); n > r; r++) k._rowMap[N.get(r)._id] = r
			}, o.buildChildren = function(m) {
				var W = this;
				m.each(function(e) {
					W._rows.add(e), W.buildChildren(e._children)
				})
			}, o.handleDataModelChange = function() {
				this.ivm()
			}, o.handleDataPropertyChange = function(K) {
				"parent" === K.property ? this.ivm() : this.invalidateData(K.data)
			}, o.handleHierarchyChange = function() {
				this.ivm()
			}, o.handleSelectionChange = function(K) {
				K.datas.each(this.invalidateData, this), this.onSelectionChanged(K)
			}, o.onSelectionChanged = function(L) {
				var u = this,
					h = u.sm();
				!u.isAutoMakeVisible() || 1 !== h.size() || "set" !== L.kind && "append" !== L.kind || u._32o || u.makeVisible(h.ld())
			}, o.handleBackgroundClick = function(m) {
				Ln(m) && !this.isCheckMode() && this.sm().cs()
			}, o.makeVisible = function(y) {
				y && (this._23I = y, this.iv())
			}, o.scrollToIndex = function(L) {
				var A = this,
					C = A._29I,
					g = C.height,
					l = A._rowHeight,
					G = l * L;
				L >= 0 && L < A._rows.size() && g > 0 && (G + l > C.y + g ? A.ty(-G + g - l) : G < C.y && A.ty(-G))
			}, o.autoScroll = function(m, C) {
				var v = this,
					k = v._rowHeight,
					E = k,
					U = k / 4,
					Z = v._29I,
					F = v.lp(m),
					s = {
						x: v.tx(),
						y: v.ty()
					};
				return k > 0 && Z && (F.x - Z.x < E ? v.translate(U, 0) : Z.x + Z.width - F.x < E && v.translate(-U, 0), F.y - Z.y < E ? v.translate(0, U) : Z.y + Z.height - F.y < E && v.translate(0, -U)), s.x = v.tx() - s.x, s.y = v.ty() - s.y, C && (C.x += s.x, C.y += s.y), s
			}, o.getTopRowOrderSelection = function() {
				var h = this.sm().getTopSelection(),
					_ = {},
					r = new ag;
				return h.each(function(r) {
					_[r._id] = r
				}), this._rows.each(function(I) {
					_[I._id] && r.add(I)
				}), r
			}, o.getRowOrderSelection = function() {
				var $ = new ag;
				return this._rows.each(function(E) {
					this.isSelected(E) && $.add(E)
				}, this), $
			}, o.ivm = function() {
				this.invalidateModel()
			}, o.invalidateModel = function() {
				var m = this;
				m._96I || (m._96I = 1, m._32I = 1, delete m._24I), m.iv()
			}, o.redraw = function() {
				var X = this;
				X._32I || (X._32I = 1, delete X._24I, X.iv())
			}, o.invalidateData = function(e) {
				var U = this;
				y ? U.redraw() : U._32I || (U._24I || (U._24I = {}), U._24I[e._id] = e, U.iv())
			}, o.getFocusData = function() {
				return this._focusData
			}, o.setFocusDataById = function(Z) {
				this.setFocusData(this.dm().getDataById(Z))
			}, o.setFocusData = function(k) {
				var T = this,
					G = T._focusData;
				G !== k && (T._focusData = k, T.fp("focusData", G, k), G && T.invalidateData(G), k && (T.invalidateData(k), T.isAutoMakeVisible() && T.makeVisible(k)))
			}, o.drawRowBackground = function(V, t, J, D, z, y, L) {
				var x = this,
					Y = x.isCheckMode();
				(t === x._focusData && Y || J && !Y) && jo(V, D, z, y, L, x.getSelectBackground(t))
			}, o.drawData = function(k, D, N) {
				var u = this,
					w = u._rowHeight,
					h = w * N,
					_ = u._29I,
					I = _.x,
					m = _.width;
				k.save(), k.beginPath(), k.rect(I, h, m, w), k.clip(), u._87o(u.drawRow(k, D, u.isSelected(D), I, h, m, w), N, I, h, m, w), k.restore(), u._rowLineVisible && jo(k, I, h + w - 1, m, 1, u._rowLineColor)
			}, o._12I = function(Z) {
				var L = this,
					r = L._31I,
					b = L._29I,
					W = b.x,
					G = b.y,
					D = b.width,
					I = b.height;
				for(Z.beginPath(), Z.rect(W, G, D, I), Z.clip(), Z.clearRect(W, G, D, I), L._76o(), L._93db(Z); r < L._14I; r++) L.drawData(Z, L._rows.get(r), r);
				L._92db(Z)
			}, o._13I = function(t) {
				for(var j, g = this, S = g._rowHeight, e = g._29I, A = e.x, Y = e.width, H = g._31I, h = g._30I; H < g._14I; H++) j = g._rows.get(H), g._24I[j._id] && h.add({
					data: j,
					index: H
				});
				h.isEmpty() || (t.beginPath(), h.each(function(y) {
					t.rect(A, y.index * S, Y, S)
				}), t.clip(), h.each(function(c) {
					t.clearRect(A, c.index * S, Y, S)
				}), h.each(function(t) {
					g._77o(t.index)
				}), g._93db(t), h.each(function(b) {
					g.drawData(t, b.data, b.index)
				}), g._92db(t), h.clear())
			}, o.validateImpl = function() {
				var g = this,
					$ = g._canvas,
					n = g.getWidth(),
					B = g.getHeight(),
					j = g._rowHeight,
					i = g._32I;
				(n !== $.clientWidth || B !== $.clientHeight) && (Mj($, n, B), i = 1);
				var T = e && !w;
				g._96I && !T && g.validateModel();
				var G = g._29I,
					V = {
						x: -g.tx(),
						y: -g.ty(),
						width: n,
						height: B
					},
					t = g._rows.size(),
					P = wc($),
					Y = g._23I;
				i || td(V, G) || (i = 1), g._29I = V, g._59I = t * j, g._31I = X(V.y / j), g._14I = q((V.y + V.height) / j), g._31I < 0 && (g._31I = 0), g._14I > t && (g._14I = t), g._99I && i && g._99I(), bi(P, g.tx(), g.ty(), 1), i ? g._12I(P) : g._24I && g._13I(P), g._93I(), g._92I(), P.restore(), g._32I = g._24I = g._96I = _, Y && (g.scrollToIndex(g.getRowIndex(Y)), delete g._23I), g.tx(g.tx()), g.ty(g.ty())
			}
		}, Eq._48o = function(G) {
			G._rootVisible = !0, G._rootData = _, G._35o = function() {
				this._expandMap = {}, this._levelMap = {}
			}, G.validateModel = function() {
				var V = this,
					Z = V._rootData;
				V._rows.clear(), V._levelMap = {}, V._rowMap = {}, V._currentLevel = 0, Z ? V._rootVisible ? V.isVisible(Z) && V.buildData(Z) : V.buildChildren(Z) : V.buildChildren(), delete V._currentLevel
			}, G.buildData = function(J) {
				var i = this,
					L = J._id,
					n = i._rows;
				i._rowMap[L] = n.size(), n.add(J), i._levelMap[L] = i._currentLevel, i.isExpanded(J) && (i._currentLevel++, i.buildChildren(J), i._currentLevel--)
			}, G.buildChildren = function(i) {
				var W = this,
					Z = i ? i._children : W._dataModel._roots,
					S = W.getCurrentSortFunc();
				S && W.isChildrenSortable(i) ? Z.toList(W.isVisible, W).sort(S).each(W.buildData, W) : Z.each(function(b) {
					W.isVisible(b) && W.buildData(b)
				})
			}, G.getLevel = function(U) {
				return this._levelMap[U._id]
			}, G.getToggleIcon = function(d) {
				var Z = this,
					T = Z._loader,
					v = Z._collapseIcon;
				return T && !T.isLoaded(d) ? v : d.hasChildren() ? Z.isExpanded(d) ? Z._expandIcon : v : _
			}, G.isCheckMode = function() {
				return this._checkMode != _
			}, G.isChildrenSortable = function() {
				return !0
			}, G.handleDataModelChange = function(A) {
				var M = this;
				A.kind === So ? delete M._expandMap[A.data._id] : A.kind === gj && (M._expandMap = {}), M.ivm()
			}, G.toggle = function(g) {
				var m = this;
				m.isExpanded(g) ? m.collapse(g) : m.expand(g)
			}, G.isExpanded = function(x) {
				return 1 === this._expandMap[x._id]
			}, G.expand = function(R) {
				var i = this,
					H = i._loader;
				i.isExpanded(R) || (H && !H.isLoaded(R) && H.load(R), i._expandMap[R._id] = 1, i.ivm(), i.onExpanded(R))
			}, G.onExpanded = function() {}, G.collapse = function(W) {
				var t = this;
				t.isExpanded(W) && (delete t._expandMap[W._id], t.ivm(), t.onCollapsed(W))
			}, G.onCollapsed = function() {}, G.expandAll = function(T) {
				if(T) this.expand(T), T.eachChild(function(y) {
					this.expandAll(y)
				}, this);
				else {
					var h = this;
					h._dataModel.each(function(y) {
						y.hasChildren() && (h._expandMap[y._id] = 1)
					}), h.ivm()
				}
			}, G.collapseAll = function() {
				this._expandMap = {}, this.ivm()
			}, G.makeVisible = function(z) {
				if(z) {
					var J = this;
					if(!J._rootData || z.isDescendantOf(J._rootData)) {
						for(var Z = z._parent; Z;) J.expand(Z), Z = Z._parent;
						J._23I = z, J.iv()
					}
				}
			}, G.checkData = function(y) {
				var t, M = this,
					G = M._checkMode,
					B = M.sm(),
					x = B.co(y);
				if(!B.sg() || !x) {
					if(M._32o = 1, G === Lm) x ? B.rs(y) : B.as(y);
					else if(G === sb) t = new ag(y), t.addAll(y._children);
					else if("descendant" === G) t = new ag, ls(y, t);
					else if("all" === G && (t = new ag, ls(y, t), !x))
						for(var s = y._parent; s;) t.add(s), s = s._parent;
					t && (x ? B.rs(t) : B.as(t)), delete M._32o
				}
			}, G._97I = function(p, J, c, s, I, b, $) {
				var d = this,
					f = d._indent,
					q = d._levelMap[J._id],
					z = d.getIconWidth(J),
					v = Ui(d.getToggleIcon(J));
				v ? (s += f * q, Ip(p, v, s + f / 2, I + $ / 2, J, d), s += f) : s += f * (q + 1), d._checkMode && (Ip(p, d.getCheckIcon(J), s + f / 2, I + $ / 2, J, d), s += f), d.drawIcon(p, J, s, I, z, $), d.drawLabel(p, J, s + z, I, $)
			}
		}, Eq._14Q = function(k) {
			k.getIcon = function(B) {
				return B.getIcon()
			}, k.getIconWidth = function(z) {
				return this.getIcon(z) ? this._indent : 0
			}, k.drawIcon = function(W, U, m, i, R, D) {
				if(R) {
					var q = this,
						F = q.getBodyColor(U),
						h = Ui(q.getIcon(U), F);
					h && (D -= q.isRowLineVisible() ? 1 : 0, yq(W, h, kh, m, i, R, D, U, q, F), so(W, q.getBorderColor(U), m, i, R, D))
				}
			}, k.drawLabel = function(r, $, h, F, G) {
				var R = this;
				ul(r, R.getLabel($), R.getLabelFont($), R.getLabelColor($), h, F, 0, G)
			}
		}, Eq._50o = function(G) {
			G._98I = function() {
				var O = this,
					i = O._39o = new uk;
				O._60I = new ag, i.mm(O._17o, O), i.md(O._18o, O), i.mh(O._19o, O)
			}, G.setColumns = function(k) {
				this._39o.clear(), this.addColumns(k)
			}, G.addColumns = function(X) {
				var B = this._39o;
				X.forEach(function(n) {
					if(!(n instanceof hd)) {
						var X = ms(n.className);
						n = Bo(X ? X : hd, n)
					}
					B.add(n)
				})
			}, G.onColumnClicked = function() {}, G.onCheckColumnClicked = function() {}, G._3Q = function(y) {
				for(var V, B = 0, S = this._60I, T = S.size(); T > B; B++)
					if(V = S.get(B), V.column === y) return V;
				return _
			}, G.getColumnAt = function(Y) {
				var w = this._4Q(Y);
				return w ? w.column : _
			}, G._4Q = function(E) {
				for(var t = this, I = E.target ? t.lp(E).x : E.x, w = t._60I, G = 0; G < w.size(); G++) {
					var l = w.get(G),
						U = l.startX;
					if(I >= U && I < U + l.column.getWidth()) return l
				}
				return _
			}, G.getToolTip = function(Q) {
				var c = this,
					u = c.getDataAt(Q),
					j = c.getColumnAt(Q);
				return u && j ? j.getToolTip(u, c) : _
			}, G.adjustTranslateX = function(Y) {
				var o = this.getWidth() - this._91I;
				return o > Y && (Y = o), Y > 0 ? 0 : g(Y)
			}, G._99I = function() {
				var g = this,
					F = g._29I,
					D = g._60I;
				D.clear(), g._91I = 0, g._39o._roots.each(function(I) {
					if(I.isVisible()) {
						var d = g._91I + I.getWidth();
						g._91I <= F.x + F.width && d >= F.x && D.add({
							column: I,
							startX: g._91I
						}), g._91I = d
					}
				})
			}, G.drawData = function(f, l, N) {
				var o = this,
					q = o._rowHeight,
					k = q * N,
					e = o.isSelected(l),
					Y = o._29I,
					B = Y.x,
					a = Y.width;
				o.drawRowBackground(f, l, e, B, k, a, q), o._60I.each(function(D) {
					var R = D.column,
						s = D.startX,
						Q = R.getWidth();
					Q > 0 && !o.isEditing(l, R) && (f.save(), f.beginPath(), f.rect(s, k, Q, q), f.clip(), o._87o(o.drawCell(f, l, e, R, s, k, Q, q), N, s, k, Q, q), o._columnLineVisible && jo(f, s + Q - 1, k, 1, q, o._columnLineColor), f.restore())
				}), o._rowLineVisible && jo(f, B, k + q - 1, a, 1, o._rowLineColor)
			}, G.drawCell = function(X, Q, u, o, j, z, J, x) {
				var q = this;
				if(o.drawCell) return o.drawCell(X, Q, u, o, j, z, J, x, q);
				var d = q.getValue(Q, o);
				an(X, d, o, q.getLabelFont(Q, o, d), q.getLabelColor(Q, o, d), j, z, J, x, Q, q)
			}, G.getColumnModel = function() {
				return this._39o
			}, G._17o = function() {
				this.redraw()
			}, G._18o = function(p) {
				var $ = this;
				p.data === $._sortColumn && $e[p.property] ? $.ivm() : ($._42o(), $.redraw())
			}, G._19o = function() {
				this.redraw()
			}, G.getCurrentSortFunc = function() {
				var p = this,
					m = p._sortColumn;
				if(m && m.isSortable()) {
					var t = m.getSortFunc(),
						$ = cd === m.getSortOrder() ? 1 : -1;
					return t || (t = nh),
						function(O, L) {
							return t.call(p, p.getValue(O, m), p.getValue(L, m), O, L) * $
						}
				}
				return p._sortFunc
			}, G.isCellEditable = function(d, X) {
				return !this.isCheckMode() && this.isSelected(d) || this.isCheckMode() && d === this._focusData ? X.isEditable() && this.isEditable() : !1
			}, G._37O = function(O, P) {
				if(Ln(P))
					for(var U = this, s = U.lp(P), w = U._60I, G = U._rowHeight, f = U._29I, o = f.x, j = f.y, X = f.width, L = f.height, i = 0; i < w.size(); i++) {
						var I = w.get(i),
							V = I.startX,
							d = I.column,
							r = d.getWidth();
						if(d !== U._31o && d !== U._4o && U.isCellEditable(O, d, P) && s.x >= V && s.x < V + r) {
							var R = {
									x: V,
									y: U.getRowIndex(O) * G,
									width: r,
									height: G
								},
								v = {
									x: R.x + U.tx(),
									y: R.y + U.ty(),
									width: R.width,
									height: R.height
								},
								l = 0,
								W = 0;
							return R.x < o ? l = R.x - o : R.x + R.width > o + X && (l = R.x + R.width - o - X), l && (U.tx(U.tx() - l), v.x -= l), R.y < j ? W = R.y - j : R.y + G > j + L && (W = R.y + G - j - L), W && (U.ty(U.ty() - W), v.y -= W), U.beginEditing({
								data: O,
								column: d,
								value: U.getValue(O, d),
								event: P,
								rect: R,
								editorRect: v,
								view: U
							}), void 0
						}
					}
			}
		}, dc.BaseItemEditor = function($, u, p, h) {
			this._data = $, this._column = u, this._master = p, this._editInfo = h
		}, $k("BaseItemEditor", f, {
			ms_ac: ["data", "column", "master", "editInfo"],
			editBeginning: function() {},
			getView: function() {},
			getValue: function() {},
			setValue: function() {}
		});
		var qj = z.Tab = function() {
			wp(qj, this)
		};
		Bm("Tab", No, {
			ms_ac: ["view", "closable", "disabled"],
			_icon: _,
			_closable: !1,
			_disabled: !1,
			setParent: jd
		});
		var hd = z.Column = function() {
			wp(hd, this)
		};
		Bm("Column", No, {
			_46o: 1,
			ms_ac: ["accessType", "valueType", be, uf, hi, kb, "align", Cr, "sortOrder", Vn, "sortable", "clickable", "nullable", "emptiable", "slider", "colorPicker", "itemEditor"],
			_visible: !0,
			_width: 80,
			_sortOrder: cd,
			_sortFunc: _,
			_sortable: !0,
			_clickable: !0,
			setWidth: function(v) {
				16 > v && (v = 16);
				var J = this._width;
				this._width = v, this.fp(kb, J, v)
			},
			getToolTip: function(l, h) {
				return this.formatValue(h.getValue(l, this))
			}
		});
		var _r = z.Property = function() {
			wp(_r, this)
		};
		Bm("Property", No, {
			_46o: 1,
			ms_ac: ["accessType", "valueType", uf, hi, "categoryName", Cr, "align", "nullable", "emptiable", "slider", "itemEditor", "colorPicker"],
			_categoryName: _,
			getToolTip: function(t, h, m) {
				var e = this;
				return h ? e.formatValue(m.getValue(t, e)) : m.getPropertyName(e)
			}
		}), dc.AccordionView = function() {
			var o = this;
			o._20o = {}, o._21o = new ag, o._10o = _, o._9o = _, o._11o = _, o._view = Co(0, o), o.iv()
		}, $k("AccordionView", f, {
			ms_v: 1,
			ms_fire: 1,
			ms_ac: [Rq, gn, "titleHeight", qo, ie, "titleBackground", "selectWidth", hn, "orientation", "separatorColor"],
			_expandIcon: h.accordionViewExpandIcon,
			_collapseIcon: h.accordionViewCollapseIcon,
			_titleHeight: vf,
			_labelColor: h.accordionViewLabelColor,
			_labelFont: h.accordionViewLabelFont,
			_titleBackground: h.accordionViewTitleBackground,
			_selectBackground: h.accordionViewSelectBackground,
			_selectWidth: h.accordionViewSelectWidth,
			_orientation: "v",
			_separatorColor: h.accordionViewSeparatorColor,
			onPropertyChanged: function() {
				this.iv()
			},
			getView: function() {
				return this._view
			},
			getTitles: function() {
				return this._21o
			},
			getCurrentTitle: function() {
				return this._10o
			},
			add: function(o, H, B, N) {
				var K = this,
					z = ff();
				if(K._20o[o]) throw o + " already exists";
				z.onmousedown = Aj, z.style.cursor = rn, z.addEventListener(k ? mj : Np, function(m) {
					Aj(m)
				}, !1), z.addEventListener(k ? Bb : Cd, function(P) {
					Aj(P), Ln(P) && (K._10o === o ? K.collapse() : K.expand(o))
				}, !1), Yb(K._view, z), K._20o[o] = {
					content: H,
					div: z,
					canvas: Qc(z),
					icon: N
				}, K._21o.add(o), B && K.expand(o), K.iv()
			},
			remove: function(d) {
				var o = this,
					O = o._20o[d];
				O && (Cj(O.div), delete o._20o[d], o._21o.remove(d), o.iv())
			},
			clear: function() {
				var h = this;
				h._20o = {}, h._21o.clear(), h.iv()
			},
			isExpanded: function($) {
				return this._10o === $
			},
			expand: function(t) {
				var j = this;
				j._20o[t] && j._10o !== t && (j._10o = t, j.onExpanded(t), j.iv())
			},
			onExpanded: function() {},
			collapse: function() {
				var S = this;
				S._10o && (S.onCollapsed(S._10o), delete S._10o, S.iv())
			},
			onCollapsed: function() {},
			initCanvas: function(r, m, d) {
				Mj(r, m, d);
				var q = wc(r);
				return bi(q, 0, 0, 1), q.clearRect(0, 0, m, d), q
			},
			drawTitle: function(l, O, E, V, X) {
				var i = this,
					N = Ui(X.icon),
					A = i.isExpanded(O),
					f = i._titleHeight,
					c = i._titleBackground,
					v = i._selectWidth,
					R = i._separatorColor,
					B = Ui(A ? i._expandIcon : i._collapseIcon),
					p = v + 4;
				jo(l, 0, 0, E, V, c), A && v && jo(l, 0, 0, v, V, i._selectBackground), (A || i._21o.get(i._21o.size() - 1) !== O) && jo(l, 0, V - 1, E, 1, R ? R : Ml(c)), N && (Ip(l, N, p + ui(N) / 2, f / 2), p += ui(N) + 2), ul(l, O, i.getLabelFont(O), i.getLabelColor(O), p, 0, 0, f), B && Ip(l, B, E - ui(B) / 2 - 4, f / 2)
			},
			validateImpl: function() {
				var m = this,
					x = m._view,
					p = 0,
					h = 0,
					X = m.getWidth(),
					V = m.getHeight(),
					v = m._titleHeight,
					a = m._21o.size() * v,
					A = m._11o,
					u = m._9o;
				delete m._11o, delete m._9o, m._21o.each(function(R) {
					var L, s, w = m._20o[R],
						c = w.content,
						$ = m._10o === R;
					cn(m) ? (Pm(w.div, p, 0, v, V), L = m.initCanvas(w.canvas, v, V), Zg(L, 0, V), lo(L, -o), m.drawTitle(L, R, V, v, w), L.restore(), $ ? (s = N(0, X - a), c && (m._11o = c, m._9o = Pp(c), Pm(c, p + v, 0, s, V)), p += v + s) : p += v) : (Pm(w.div, 0, h, X, v), L = m.initCanvas(w.canvas, X, v), m.drawTitle(L, R, X, v, w), L.restore(), $ ? (s = N(0, V - a), c && (m._11o = c, m._9o = Pp(c), Pm(c, 0, h + v, X, s)), h += v + s) : h += v)
				});
				var K = m._9o;
				A && A !== m._11o && A.endEditing && A.endEditing(), K && K !== u && Yb(x, K), u && u !== K && Cj(u)
			}
		}), dc.SplitView = function(l, V, g, p) {
			var E = this,
				A = E._dividerDiv = ff(),
				w = E._60O = Qc(),
				D = E._61O = Qc(),
				U = w.style,
				j = D.style;
			E._view = Co(1, E), Yb(E._view, A), U.msTouchAction = Bi, U.pointerEvents = Bi, U.cursor = rn, j.msTouchAction = Bi, j.pointerEvents = Bi, j.cursor = rn, l && E.setLeftView(l), V && E.setRightView(V), g && E.setOrientation(g), p != _ && E.setPosition(p), E.setStatus(xq), new df(E)
		}, $k("SplitView", f, {
			ms_v: 1,
			ms_fire: 1,
			ms_ac: ["continuousLayout", "dividerSize", "dividerBackground", "toggleIcon", "togglable", "dragOpacity", "orientation", "draggable", "status"],
			_continuousLayout: !1,
			_position: .5,
			_togglable: !0,
			_orientation: "h",
			_draggable: !0,
			_dividerSize: h.splitViewDividerSize,
			_dividerBackground: h.splitViewDividerBackground,
			_dragOpacity: h.splitViewDragOpacity,
			_toggleIcon: h.splitViewToggleIcon,
			onPropertyChanged: function() {
				this.iv()
			},
			getDividerDiv: function() {
				return this._dividerDiv
			},
			getPosition: function() {
				return this._position
			},
			setPosition: function(c, $) {
				var O = this,
					J = O._position;
				isNaN(c) || ($ || (O._82O = 0 > c ? -1 : c > 1 ? 1 : 0), O._position = c, O.fp(Mh, J, c))
			},
			getLeftView: function() {
				return this._leftView
			},
			setLeftView: function(n) {
				var Z = this,
					A = Z._leftView,
					y = Z._view;
				if(Z._leftView !== n) {
					if(A && A !== Z._rightView) {
						var F = Pp(A);
						F.parentNode === y && Cj(F)
					}
					if(Z._leftView = n, n) {
						var R = Pp(n);
						R.parentNode !== y && y.insertBefore(R, Z._dividerDiv)
					}
					Z.fp("leftView", A, n)
				}
			},
			getRightView: function() {
				return this._rightView
			},
			setRightView: function(G) {
				var t = this,
					$ = t._rightView,
					s = t._view;
				if(t._rightView !== G) {
					if($ && $ !== t._leftView) {
						var Z = Pp($);
						Z.parentNode === s && Cj(Z)
					}
					if(t._rightView = G, G) {
						var N = Pp(G);
						N.parentNode !== s && s.insertBefore(N, t._dividerDiv)
					}
					t.fp("rightView", $, G)
				}
			},
			validateImpl: function() {
				var H = this,
					b = H._draggable,
					U = H._position,
					$ = H.getWidth(),
					n = H.getHeight(),
					O = H._dividerSize,
					Z = H._dividerBackground,
					B = k ? 18 : 8,
					p = H._dividerDiv,
					d = H._82O,
					M = H._60O,
					e = H._61O,
					u = H._toggleIcon,
					v = H._status,
					i = p.style,
					s = null,
					J = k ? 20 : 4,
					l = u.comps[0];
				O >= B || 0 === O ? H._coverDiv && (Cj(H._coverDiv), delete H._coverDiv) : H._coverDiv || (H._coverDiv = ff(), P && (H._coverDiv.style.background = $i), Yb(p, H._coverDiv)), H._togglable ? M.parentNode || (Yb(p, M), Yb(p, e)) : (Cj(M), Cj(e));
				var W = H._coverDiv,
					j = H._leftView,
					S = H._rightView;
				if(cn(H)) {
					if(O > $ && (O = $), v === xq)
						if(1 === d) var z = R(U, $),
							Y = N(0, $ - O - z);
						else -1 === d ? (Y = R(-U, $), z = N(0, $ - O - Y)) : (z = g(($ - O) * U), Y = N(0, $ - O - z));
					else "cl" === v ? (z = 0, Y = N(0, $ - O)) : "cr" === v && (Y = 0, z = N(0, $ - O));
					j && Pm(j, 0, 0, z, n), S && Pm(S, z + O, 0, Y, n), Pm(p, z, 0, O, n), H._22o = z, W && (Pm(W, O / 2 - B / 2, 0, B, n), W.style.cursor = b ? Ci : ""), p.style.cursor = b ? Ci : "";
					var F = p.clientHeight / 2,
						m = p.clientWidth;
					Mj(M, m, m), Pm(M, 0, F - m - J, m, m), s = wc(M), bi(s, 0, 0, 1), l.rotation = -o, wd(s, u, 0, 0, m, m), s.restore(), Mj(e, m, m), Pm(e, 0, F + J, m, m), s = wc(e), bi(s, 0, 0, 1), l.rotation = o, wd(s, u, 0, 0, m, m), s.restore()
				} else {
					if(O > n && (O = n), v === xq)
						if(1 === d) var y = R(U, n),
							f = N(0, n - O - y);
						else -1 === d ? (f = R(-U, n), y = N(0, n - O - f)) : (y = g((n - O) * U), f = N(0, n - O - y));
					else "cl" === v ? (y = 0, f = N(0, n - O)) : "cr" === v && (f = 0, y = N(0, n - O));
					j && Pm(j, 0, 0, $, y), S && Pm(S, 0, y + O, $, f), Pm(p, 0, y, $, O), H._22o = y, W && (Pm(W, 0, O / 2 - B / 2, $, B), W.style.cursor = b ? sm : ""), i.cursor = b ? sm : "";
					var L = p.clientWidth / 2,
						m = p.clientHeight;
					Mj(M, m, m), Pm(M, L - m - J, 0, m, m), s = wc(M), bi(s, 0, 0, 1), l.rotation = 0, wd(s, u, 0, 0, m, m), s.restore(), Mj(e, m, m), Pm(e, L + J, 0, m, m), s = wc(e), bi(s, 0, 0, 1), l.rotation = V, wd(s, u, 0, 0, m, m), s.restore()
				}
				i.background = Z
			}
		});
		var df = function(f) {
			this.sv = f, this.addListeners()
		};
		xh(df, f, {
			ms_listener: 1,
			getView: function() {
				return this.sv.getView()
			},
			handle_touchstart: function(i) {
				var O = this,
					h = O.sv,
					V = h._dividerDiv,
					k = h._60O,
					X = h._61O,
					g = h._status,
					G = i.target;
				if(G === k) g === xq ? h.setStatus("cl") : "cr" === g && h.setStatus(xq);
				else if(G === X) g === xq ? h.setStatus("cr") : "cl" === g && h.setStatus(xq);
				else if(gc(i) && (G === V || G === h._coverDiv) && (Aj(i), h.isDraggable())) {
					h.getLeftView(), h.getRightView();
					var r = O.maskDiv = ff();
					if(r.style.left = 0, r.style.top = 0, r.style.width = h.getWidth() + "px", r.style.height = h.getHeight() + "px", h.getView().appendChild(r), !h.isContinuousLayout()) {
						var x = O.resizeDiv = ff();
						x.style.left = V.style.left, x.style.top = V.style.top, x.style.width = V.style.width, x.style.height = V.style.height, x.style.opacity = h.getDragOpacity(), x.style.background = h.getDividerBackground(), Yb(O.getView(), x)
					}
					O._lastAbsPosition = h._22o, O._86o = cn(h) ? Br(i).x : Br(i).y, ti(O, i)
				}
			},
			handleWindowTouchMove: function(o) {
				gc(o) && this.update(o, this.sv.isContinuousLayout())
			},
			handleWindowTouchEnd: function(q) {
				var A = this;
				A.update(q, !0), A.sv.setStatus(xq), A.maskDiv && Cj(A.maskDiv), A.resizeDiv && Cj(A.resizeDiv), A.maskDiv = A.resizeDiv = _
			},
			handle_mousedown: function(Y) {
				Ln(Y) && this.handle_touchstart(Y)
			},
			handleWindowMouseMove: function(E) {
				this.handleWindowTouchMove(E)
			},
			handleWindowMouseUp: function(B) {
				this.handleWindowTouchEnd(B)
			},
			update: function(Z, B) {
				var s = this,
					Q = s.sv,
					m = cn(Q) ? Q.getWidth() : Q.getHeight(),
					t = Q._dividerSize,
					q = s._lastAbsPosition - s._86o;
				cn(Q) ? (q += Br(Z).x, q > m - t && (q = m - t), 0 > q && (q = 0), s.resizeDiv && (s.resizeDiv.style.left = q + hh)) : (q += Br(Z).y, q > m - t && (q = m - t), 0 > q && (q = 0), s.resizeDiv && (s.resizeDiv.style.top = q + hh)), B && m !== t && (1 === Q._82O ? Q.setPosition(q, 1) : -1 === Q._82O ? Q.setPosition(q - m + t, 1) : Q.setPosition(q / (m - t), 1))
			}
		}), dc.TabView = function() {
			var O = this,
				E = O._view = Co(1, O),
				J = O._91O = ff(1),
				I = O._tabModel = new uk,
				t = I.sm(),
				H = O.invalidate;
			O._7o = new ag, O._canvas = Qc(J), Yb(E, J), Yb(E, O._92O = ff(1)), t.setSelectionMode(yg), t.ms(H, O), I.mm(H, O), I.md(H, O), I.mh(H, O), new $m(O), O.iv()
		}, $k("TabView", f, {
			ms_v: 1,
			ms_fire: 1,
			ms_tx: 1,
			ms_ty: 1,
			ms_lp: 1,
			ms_ac: ["movable", "tabGap", "tabHeight", "tabPosition", qo, ie, "tabBackground", "selectWidth", hn, "moveBackground", "insertColor"],
			_tabPosition: Pi,
			_tabHeight: vf,
			_tabGap: h.tabViewTabGap,
			_labelColor: h.tabViewLabelColor,
			_labelFont: h.tabViewLabelFont,
			_tabBackground: h.tabViewTabBackground,
			_selectWidth: h.tabViewSelectWidth,
			_selectBackground: h.tabViewSelectBackground,
			_moveBackground: h.tabViewMoveBackground,
			_insertColor: h.tabViewInsertColor,
			_movable: !0,
			getContentDiv: function() {
				return this._92O
			},
			getTitleDiv: function() {
				return this._91O
			},
			getTabModel: function() {
				return this._tabModel
			},
			add: function(b, t, j) {
				var m = new qj,
					x = this._tabModel;
				return m.setName(b), m.setView(t), x.add(m), j && x.sm().ss(m), m
			},
			getLabel: function(o) {
				return o.toLabel()
			},
			onPropertyChanged: function() {
				this.iv()
			},
			_7Q: function(J) {
				this._23o = J, this.iv()
			},
			get: function(t) {
				var R = this,
					g = R._tabModel;
				if(jb(t)) return g._roots.get(t);
				if(Ol(t)) {
					var Y;
					return g.each(function(b) {
						t === R.getLabel(b) && (Y = b)
					}), Y
				}
				return t instanceof qj ? t : _
			},
			select: function(X) {
				this._tabModel.sm().ss(this.get(X))
			},
			remove: function(d) {
				var i = this;
				if(d = i.get(d)) {
					var S = i._tabModel,
						_ = S._roots.indexOf(d);
					i._tabModel.remove(d), i._12Q(--_)
				}
			},
			getCurrentTab: function() {
				return this._8o
			},
			hideTabView: function(N, J) {
				J.parentNode === this._92O && (Pn(J) ? (J.style.display = Lo, J._tab_ = N) : Cj(J), Jh())
			},
			showTabView: function(c, D) {
				Pn(D) && (D.style.display = "block", D._tab_ = c), D.parentNode !== this._92O && (Yb(this._92O, D), Jh())
			},
			_24o: function() {
				var X, k = this,
					U = k._8o,
					f = k._9o,
					l = k._tabModel.sm().ld();
				l && (X = Pp(l.getView())), X !== f && (f && (U.getView() && U.getView().endEditing && U.getView().endEditing(), k.hideTabView(U, f)), X && k.showTabView(l, X)), k._8o = l, k._9o = X, U !== l && k.onTabChanged(U, l)
			},
			onTabClosing: function() {
				return !0
			},
			onTabChanged: function() {},
			onTabClosed: function(X, Q) {
				this._12Q(--Q)
			},
			_12Q: function(A) {
				var O = this,
					j = O._tabModel,
					z = j.size();
				if(z && !j.sm().ld()) {
					A == _ && (A = 0), A >= z && (A = z - 1), 0 > A && (A = 0);
					for(var I = A; I >= 0; I--) {
						var t = O.get(I);
						if(!t.isDisabled()) return O.select(t), t
					}
					for(I = A + 1; z > I; I++)
						if(t = O.get(I), !t.isDisabled()) return O.select(t), t
				}
			},
			getTabWidth: function(X) {
				var l = 4,
					J = Ui(X.getIcon());
				J && (l += ui(J, X) + 4);
				var n = this.getLabel(X);
				return n && (l += Re(this.getLabelFont(X), n).width + 4), X.isClosable() && (l += 10), l
			},
			drawTab: function(A, b, Q, t, W, J, M) {
				var c, f = this,
					q = f._tabPosition,
					n = Q + 4,
					X = f._selectWidth,
					E = Ui(b.getIcon()),
					p = b.isDisabled(),
					h = f.getLabelColor(b),
					m = f.getLabelFont(b),
					w = f.getLabel(b),
					a = f._selectBackground,
					s = q === vr + "-vertical",
					T = q === Td + "-vertical";
				(s || T) && (n = t + 4), p && (A.globalAlpha = ck), jo(A, Q, t, W, J, M), b === f._8o && X && (q === Pi ? jo(A, Q, t + J - X, W, X, a) : q === vr ? jo(A, Q + W - X, t, X, J, a) : q === Td ? jo(A, Q, t, X, J, a) : s ? jo(A, Q + W - X, t, X, J, a) : T ? jo(A, Q, t, X, J, a) : jo(A, Q, t, W, X, a));
				var C = W / 2;
				if(s && (Zg(A, C, t + J / 2), lo(A, V), Zg(A, -C, -t - J / 2)), E) {
					var N = Hk(E, b),
						Y = ui(E, b);
					if(s || T) {
						var x = Q + W / 2,
							U = n + N / 2;
						Zg(A, x, U), lo(A, o), Zg(A, -x, -U), Ip(A, E, Q + W / 2, n + N / 2, b, f), Zg(A, x, U), lo(A, -o), Zg(A, -x, -U), n += N + 4
					} else Ip(A, E, n + Y / 2, t + J / 2, b, f), n += Y + 4
				}
				return s || T ? (Zg(A, W / 2, n + W / 2), lo(A, o), Zg(A, -W / 2, -n - W / 2), ul(A, w, m, h, Q, n, J, W), Zg(A, W / 2, n + W / 2), lo(A, -o), Zg(A, -W / 2, -n - W / 2)) : ul(A, w, m, h, n, t, W, J), s && (Zg(A, C, t + J / 2), lo(A, -V), Zg(A, -C, -t - J / 2)), b.isClosable() && (c = T ? {
					x: Q + W - 12,
					y: t + J - 12,
					width: 12,
					height: 12
				} : {
					x: Q + W - 12,
					y: t + 2,
					width: 12,
					height: 12
				}, this.drawCloseIcon(b, A, h, c)), p && (A.globalAlpha = 1), c
			},
			drawCloseIcon: function(W, V, C, v) {
				var i = v.x,
					f = v.y;
				V.strokeStyle = C, V.lineWidth = 1, V.beginPath(), V.moveTo(i + 2, f + 8), V.lineTo(i + 8, f + 2), V.moveTo(i + 8, f + 8), V.lineTo(i + 2, f + 2), V.stroke()
			},
			validateImpl: function() {
				var H = this;
				H._24o();
				var r, p = H._canvas,
					M = H._tabPosition,
					n = H._91O,
					j = H._92O,
					z = H._tabModel,
					S = H.getWidth(),
					s = H.getHeight(),
					l = H._tabHeight,
					R = H._7o,
					d = H._tabGap,
					k = M === Pi,
					U = M === vr,
					a = M === Td,
					u = M === vr + "-vertical",
					A = M === Td + "-vertical",
					y = H._23o,
					D = 0;
				if((U || a) && z._roots.each(function(m) {
						D = N(H.getTabWidth(m), D)
					}), k ? (Pm(n, 0, 0, S, l), r = {
						x: 0,
						y: l,
						width: S,
						height: N(0, s - l)
					}) : U ? (Pm(n, 0, 0, D, s), r = {
						x: D,
						y: 0,
						width: N(0, S - D),
						height: s
					}) : a ? (Pm(n, S - D, 0, D, s), r = {
						x: 0,
						y: 0,
						width: N(0, S - D),
						height: s
					}) : u ? (Pm(n, 0, 0, l, s), r = {
						x: l,
						y: 0,
						width: N(0, S - l),
						height: s
					}) : A ? (Pm(n, S - l, 0, l, s), r = {
						x: 0,
						y: 0,
						width: N(0, S - l),
						height: s
					}) : (Pm(n, 0, s - l, S, l), r = {
						x: 0,
						y: 0,
						width: S,
						height: N(0, s - l)
					}), Pm(j, r), u || A) {
					H._9o && (r.x = 0, Pm(H._8o.getView(), r)), Mj(p, l, s);
					var K = wc(p),
						o = 0;
					if(bi(K, 0, H.ty(), 1), K.clearRect(0, 0, l, s), R.clear(), z._roots.each(function(r) {
							var W, k = H.getTabWidth(r);
							y && y.tab === r || (W = H.drawTab(K, r, 0, o, l, k, H._tabBackground)), R.add({
								_75o: W,
								tab: r,
								startY: o,
								endY: o + k,
								height: k
							}), o += k + d
						}), H._23Q = N(0, o - d), y) {
						var T = y.position;
						H.drawTab(K, y.tab, 0, y.startY, l, y.height, H._moveBackground), jo(K, 0, T, l, 1, H._insertColor)
					}
					K.restore(), H.ty(H.ty())
				} else if(U || a) {
					H._9o && (r.x = 0, Pm(H._8o.getView(), r)), Mj(p, D, s);
					var K = wc(p),
						o = 0;
					if(bi(K, 0, H.ty(), 1), K.clearRect(0, 0, D, s), R.clear(), z._roots.each(function(Q) {
							var C;
							y && y.tab === Q || (C = H.drawTab(K, Q, 0, o, D, l, H._tabBackground)), R.add({
								_75o: C,
								tab: Q,
								startY: o,
								endY: o + l,
								height: l
							}), o += l + d
						}), H._23Q = N(0, o - d), y) {
						var T = y.position;
						H.drawTab(K, y.tab, 0, y.startY, D, y.height, H._moveBackground), jo(K, 0, T, D, 1, H._insertColor)
					}
					K.restore(), H.ty(H.ty())
				} else {
					H._9o && (r.y = 0, Pm(H._8o.getView(), r)), Mj(p, S, l);
					var K = wc(p),
						q = 0;
					if(bi(K, H.tx(), 0, 1), K.clearRect(0, 0, S, l), R.clear(), z._roots.each(function(k) {
							var w, Z = H.getTabWidth(k);
							y && y.tab === k || (w = H.drawTab(K, k, q, 0, Z, l, H._tabBackground)), R.add({
								_75o: w,
								tab: k,
								startX: q,
								endX: q + Z,
								width: Z
							}), q += Z + d
						}), H._64I = N(0, q - d), y) {
						var T = y.position;
						H.drawTab(K, y.tab, y.startX, 0, y.width, l, H._moveBackground), Vc(K, H._insertColor, T, 0, l)
					}
					K.restore(), H.tx(H.tx())
				}
				for(var O = [], w = j.children, G = 0; G < w.length; G++) {
					var Y = w[G],
						v = Y._tab_;
					v && !z.contains(v) && O.push(Y)
				}
				O.forEach(function(g) {
					j.removeChild(g)
				})
			}
		});
		var $m = function(h) {
			this.tv = h, this.addListeners()
		};
		xh($m, f, {
			ms_listener: 1,
			getView: function() {
				return this.tv._91O
			},
			handle_mousewheel: function(_) {
				this.handleScroll(_, 10 * (_.wheelDelta / 40))
			},
			handle_DOMMouseScroll: function(V) {
				this.handleScroll(V, 10 * -V.detail)
			},
			handleScroll: function(h, q) {
				Aj(h);
				var z = this.tv,
					J = z._tabPosition;
				!z._40o() || J !== Pi && J !== ed || z.tx(this.tv.tx() + q), !z._41o() || J !== vr && J !== Td && J !== vr + "-vertical" && J !== Td + "-vertical" || z.ty(this.tv.ty() + q)
			},
			_8Q: function(k) {
				var p, F, w = this.tv,
					I = w._tabPosition,
					U = w._7o;
				if(I === Pi || I === ed) {
					var C = w.lp(k).x;
					for(p = 0; p < U.size(); p++)
						if(F = U.get(p), F.startX <= C && C <= F.endX) return F
				} else if(I === vr || I === Td || I === vr + "-vertical" || I === Td + "-vertical") {
					var T = w.lp(k).y;
					for(p = 0; p < U.size(); p++)
						if(F = U.get(p), F.startY <= T && T <= F.endY) return F
				}
				return _
			},
			isClickable: function(x) {
				var O = this.tv,
					U = O._tabPosition,
					f = this._73o = this._8Q(x);
				return !O._40o() || U !== Pi && U !== ed ? !O._41o() || U !== vr && U !== Td && U !== vr + "-vertical" && U !== Td + "-vertical" ? f && (!f.tab.isDisabled() || O.isMovable()) : !0 : !0
			},
			handle_mousemove: function(b) {
				var n = this;
				zg ? n._74o = n._8Q(b) : n.getView().style.cursor = n.isClickable(b) ? rn : ""
			},
			handle_mousedown: function(U) {
				this.handle_mousemove(U), this.handle_touchstart(U)
			},
			handle_touchstart: function(e) {
				var m = this,
					I = m.tv,
					g = I._tabPosition;
				Aj(e), m.isClickable(e) && (g === Pi || g === ed ? (m.x = Br(e).x, m.lp = I.lp(e), m.tx = I.tx()) : (m.y = Br(e).y, m.lp = I.lp(e), m.ty = I.ty()), ti(m, e))
			},
			handleWindowMouseMove: function(q) {
				this.handleWindowTouchMove(q)
			},
			handleWindowTouchMove: function(D) {
				var e, g = this,
					r = g.tv,
					A = r._tabPosition,
					L = g._73o;
				if(A === Pi || A === ed) {
					if(e = Br(D).x - g.x, !g._25o && !g.moving && d(e) > 2 && (r._40o() && !Sj(D) ? g._25o = 1 : L && r.isMovable() && (g.moving = 1)), g._25o) r.tx(g.tx + e);
					else if(g.moving) {
						var H = g.lp.x + e,
							n = r._tabGap / 2;
						r._7o.each(function(Q) {
							var O = Q.endX,
								I = H - Q.startX < O - H;
							H >= Q.startX && O >= H && r._7Q({
								tab: L.tab,
								startX: L.startX + e,
								width: L.width,
								front: I,
								insertTab: Q.tab,
								position: I ? N(0, Q.startX - n) : R(r._64I, O + n)
							})
						})
					}
				} else if(e = Br(D).y - g.y, !g._25o && !g.moving && d(e) > 2 && (r._41o() && !Sj(D) ? g._25o = 1 : L && r.isMovable() && (g.moving = 1)), g._25o) r.ty(g.ty + e);
				else if(g.moving) {
					var S = g.lp.y + e,
						n = r._tabGap / 2;
					r._7o.each(function(O) {
						var H = O.endY,
							t = S - O.startY < H - S;
						S >= O.startY && H >= S && r._7Q({
							tab: L.tab,
							startY: L.startY + e,
							height: L.height,
							front: t,
							insertTab: O.tab,
							position: t ? N(0, O.startY - n) : R(r._23Q, H + n)
						})
					})
				}
			},
			handleWindowMouseUp: function(K) {
				this.handleWindowTouchEnd(K)
			},
			handleWindowTouchEnd: function() {
				var B = this,
					s = B.tv,
					C = s._tabPosition,
					e = s.getTabModel(),
					o = e._roots,
					g = B._73o;
				if(B.moving) {
					var n = s._23o;
					if(n && n.insertTab !== n.tab) {
						var q = n.tab,
							G = o.remove(q),
							L = o.indexOf(n.insertTab);
						L >= 0 && (n.front || L++, L <= o.size() && (o.add(q, L), e._38I(q, G, L)))
					}
					s._7Q(_), delete B.moving
				} else if(!B._25o && g) {
					q = g.tab;
					var X = B._74o;
					if(!X || X.tab === q)
						if(!q.isDisabled() && Qf(g._75o, B.lp)) {
							var A = function() {
								var d = o.indexOf(q);
								e.remove(q), s.onTabClosed(q, d)
							};
							s.onTabClosing(q, A) && A()
						} else q.isDisabled() || s._8o === q || e.sm().ss(q)
				}
				B._25o = B._73o = B._74o = C === Pi || C === ed ? B.x = B.lp = B.tx = _ : B.y = B.lp = B.ty = _
			}
		}), dc.PropertyView = function(o) {
			var w = this;
			w._view = Co(1, w), w._canvas = Qc(w._view), Yb(w._view, w._79O = ff()), w._rows = new ag, w._28o = new ag, w._26o = {}, w._26Q = {};
			var P = w._propertyModel = new uk,
				A = w.ivm;
			P.mm(A, w), P.md(A, w), P.mh(A, w), w.dm(o ? o : new uk), new Nm(w)
		}, $k("PropertyView", f, {
			ms_ac: [qo, rp, ie, uf, hi, "categorizable", Rh, Vn, $q, Rq, gn, oq, fb, eq, "selectRowIndex", hn, "background", sd, Ir, tj, tm, Tr],
			ms_v: 1,
			ms_dm: 1,
			ms_fire: 1,
			ms_sm: 1,
			_49o: 1,
			ms_txy: 1,
			ms_lp: 1,
			ms_vs: 1,
			_45o: 1,
			_47o: 1,
			ms_tip: 1,
			_29I: ih,
			_59I: 0,
			_9I: 0,
			_selectRowIndex: -1,
			_editable: !0,
			_batchEditable: !0,
			_categorizable: !0,
			_indent: ab,
			_background: h.propertyViewBackground,
			_expandIcon: h.propertyViewExpandIcon,
			_collapseIcon: h.propertyViewCollapseIcon,
			_scrollBarColor: Bq,
			_scrollBarSize: sr,
			_autoHideScrollBar: Vp,
			_selectBackground: h.propertyViewSelectBackground,
			_rowHeight: Hr,
			_rowLineVisible: h.propertyViewRowLineVisible,
			_rowLineColor: h.propertyViewRowLineColor,
			_10I: .5,
			_columnLineVisible: h.propertyViewColumnLineVisible,
			_columnLineColor: h.propertyViewColumnLineColor,
			_labelColor: h.propertyViewLabelColor,
			_labelSelectColor: h.propertyViewLabelSelectColor,
			_labelFont: h.propertyViewLabelFont,
			getRows: function() {
				return this._rows
			},
			getColumnPosition: function() {
				return this._10I
			},
			setColumnPosition: function($) {
				0 > $ && ($ = 0), $ > 1 && ($ = 1);
				var P = this,
					b = P._10I;
				P._10I = $, P.fp("columnPosition", b, $)
			},
			getPropertyName: function(r) {
				return r.toLabel()
			},
			getLabelFont: function() {
				return this._labelFont
			},
			getLabelColor: function(L, c, S) {
				return S === this._selectRowIndex ? this._labelSelectColor : this._labelColor
			},
			getPropertyFont: function() {
				return this._labelFont
			},
			getPropertyColor: function(s, v) {
				return v === this._selectRowIndex ? this._labelSelectColor : s.getColor() || this._labelColor
			},
			getCategoryFont: function() {
				return this._labelFont
			},
			getCategoryColor: function() {
				return this._labelColor
			},
			adjustTranslateX: function() {
				return 0
			},
			adjustTranslateY: function(K) {
				var b = this.getHeight() - this._59I;
				return b > K && (K = b), K > 0 ? 0 : g(K)
			},
			isExpanded: function(W) {
				if(!W) return !0;
				var I = this._26o[W];
				return I ? I.isExpanded : !(this._26Q[W] === !1)
			},
			toggle: function(N) {
				var e = this;
				e.isExpanded(N) ? e.collapse(N) : e.expand(N)
			},
			expandAll: function() {
				this.validate();
				for(var F in this._26o) this.expand(F)
			},
			expand: function(Q) {
				if(Q && Q !== Lo) {
					var f = this,
						i = f._26o[Q];
					i && !i.isExpanded && (i.isExpanded = !0, f.onExpanded(Q), f.ivm())
				}
			},
			onExpanded: function() {},
			collapseAll: function() {
				this.validate();
				for(var A in this._26o) this.collapse(A)
			},
			collapse: function(W) {
				if(W && W !== Lo) {
					var o = this,
						H = o._26o[W];
					H && H.isExpanded && (H.isExpanded = !1, o.onCollapsed(W), o.ivm())
				}
			},
			onCollapsed: function() {},
			getCategoryName: function(q) {
				if(!this.isCategorizable()) return Lo;
				var I = q.getCategoryName();
				return I ? I : Lo
			},
			getPropertyModel: function() {
				return this._propertyModel
			},
			handleSelectionChange: function() {
				this.ivm()
			},
			setDataModel: function(U) {
				var O = this,
					Z = O._dataModel;
				Z !== U && (Z && (Z.umd(O.handlePropertyChange, O), O._selectionModel || Z.sm().ums(O.handleSelectionChange, O)), O._dataModel = U, U.md(O.handlePropertyChange, O), O._selectionModel ? O._selectionModel._21I(U) : U.sm().ms(O.handleSelectionChange, O), O.fp(qi, Z, U))
			},
			isVisible: function(w) {
				return this._visibleFunc ? this._visibleFunc(w) : !0
			},
			onPropertyChanged: function(x) {
				var S = this,
					s = x.property;
				ij[s] ? S.ivm() : S.iv(), s === Dj && S._43o()
			},
			getCurrentData: function() {
				return this._27o
			},
			updateCurrentData: function() {
				this._27o = this.sm().ld()
			},
			getRawProperties: function() {
				return this._27o ? this._propertyModel._roots : Op
			},
			handlePropertyChange: function(U) {
				this._27o === U.data && this.iv()
			},
			ivm: function() {
				this.invalidateModel()
			},
			invalidateModel: function() {
				var i = this;
				i._96I || (i.setSelectRowIndex(-1), i._96I = 1, i.iv())
			},
			redraw: function() {
				this.iv()
			},
			validateModel: function() {
				var W = this,
					c = W._rows,
					Z = W._28o,
					M = {},
					U = new ag,
					$ = W._27o;
				W.updateCurrentData(), $ !== W._27o && W.endEditing(), c.clear(), Z.clear(), W.getRawProperties().each(function(R) {
					if(W.isVisible(R)) {
						U.add(R);
						var X = W.getCategoryName(R);
						M[X] || (Z.add(X, X === Lo ? 0 : S), M[X] = {
							isExpanded: W.isExpanded(X),
							properties: new ag
						})
					}
				}), W._sortFunc && U.sort(W._sortFunc);
				for(var x in W._26o) W._26Q[x] = W.isExpanded(x);
				W._26o = M, Z.each(function(w) {
					w !== Lo && c.add(w);
					var E = M[w];
					E.isExpanded && U.each(function(x) {
						W.getCategoryName(x) === w && (E.properties.add(x), c.add({
							property: x,
							data: W._27o
						}))
					}, W)
				})
			},
			validateImpl: function() {
				var U = this;
				U._76o(), U._96I && (U.validateModel(), delete U._96I);
				var H = U._canvas,
					B = U.getWidth(),
					v = U.getHeight(),
					f = -U.ty(),
					r = U._rowHeight,
					S = U._indent,
					b = B - S,
					C = U._rows,
					L = C.size(),
					m = U._9I = S + b * U._10I,
					I = U._59I = L * r;
				Mj(H, B, v), U._29I = {
					x: 0,
					y: f,
					width: B,
					height: v
				}, U._31I = X(f / r), U._14I = q((f + v) / r), U._31I < 0 && (U._31I = 0), U._14I > L && (U._14I = L);
				var n, F = wc(H),
					l = U._background;
				bi(F, 0, -f, 1), F.beginPath(), F.rect(0, f, B, v), F.clip(), F.clearRect(0, f, B, v), U._93db(F), l && jo(F, 0, 0, S, I, l);
				for(var P = U._31I; P < U._14I; P++) {
					var p = C.get(P),
						f = r * P;
					if(Ol(p)) l && jo(F, S, f, b, r, l), n = Ui(U.isExpanded(p) ? U._expandIcon : U._collapseIcon), n && yq(F, n, kh, 0, f, S, r), F.save(), F.beginPath(), F.rect(S, f, b, r), F.clip(), U.drawCategoryName(F, p, P, S, f, b, r), F.restore();
					else {
						var u = p.property,
							g = p.data,
							n = Ui(u.getIcon()),
							M = U._selectRowIndex === P ? U.getSelectBackground() : _;
						if(n && yq(F, n, kh, 0, f, S, r), M && jo(F, S, f, b, r, M), F.save(), F.beginPath(), F.rect(S, f, m - S, r), F.clip(), U.drawPropertyName(F, u, P, S, f, m - S, r), F.restore(), !U.isEditing(g, u)) {
							var G = m + 1,
								W = B - m - 1;
							F.save(), F.beginPath(), F.rect(G, f, W, r), F.clip(), U._87o(U.drawPropertyValue(F, u, U.getValue(g, u), P, G, f, W, r, g), P, G, f, W, r), F.restore()
						}
					}
					U._rowLineVisible && jo(F, S, f + r - 1, b, 1, U._rowLineColor)
				}
				U._columnLineVisible && (jo(F, m, 0, 1, I, U._columnLineColor), jo(F, B - 1, 0, 1, I)), U._92db(F), U._93I(), F.restore(), U.ty(U.ty())
			},
			drawCategoryName: function(X, b, N, $, U, J, P) {
				ul(X, b, this.getCategoryFont(b), this.getCategoryColor(b), $, U, J, P)
			},
			drawPropertyName: function(o, r, x, s, c, U, p) {
				return r.drawPropertyName ? (r.drawPropertyName(o, r, x, s, c, U, p, this), void 0) : (ul(o, this.getPropertyName(r), this.getPropertyFont(r, x), this.getPropertyColor(r, x), s, c, U, p), void 0)
			},
			drawPropertyValue: function(V, r, l, Q, A, t, i, m, J) {
				return r.drawPropertyValue ? r.drawPropertyValue(V, r, l, Q, A, t, i, m, J, this) : (an(V, l, r, this.getLabelFont(r, l, Q), this.getLabelColor(r, l, Q), A, t, i, m, J, this), void 0)
			},
			isPropertyEditable: function(p) {
				return p.isEditable() && this.isEditable()
			},
			setProperties: function(b) {
				this._propertyModel.clear(), this.addProperties(b)
			},
			addProperties: function(b) {
				if(b) {
					var M = this._propertyModel;
					b.forEach(function(O) {
						if(!(O instanceof _r)) {
							var y = ms(O.className);
							O = Bo(y ? y : _r, O)
						}
						M.add(O)
					})
				}
			},
			getRowIndexAt: function(e) {
				var y = this,
					D = X(y.lp(e).y / y._rowHeight);
				return D >= 0 && D < y._rows.size() ? D : -1
			},
			getPropertyAt: function(B) {
				var Q = this,
					D = Q.getRowIndexAt(B);
				return D >= 0 ? Q._rows.get(D).property : _
			},
			getToolTip: function(W) {
				var c = this,
					Y = c.getPropertyAt(W),
					V = c._27o;
				return Y && V ? Y.getToolTip(V, c._9I < c.lp(W).x, c) : _
			}
		});
		var Nm = function(y) {
			this.pv = y, this.addListeners()
		};
		xh(Nm, f, {
			ms_listener: 1,
			getView: function() {
				return this.pv._view
			},
			setCursor: function(j) {
				this.getView().style.cursor = j
			},
			clear: function() {
				var U = this;
				U._62O = U.cp = U.ty = U.p = _, U.setCursor(Lm)
			},
			handle_mousedown: function(g) {
				this.handle_touchstart(g)
			},
			handle_touchstart: function(z) {
				var r = this,
					T = r.pv;
				Aj(z), T.setFocus(z) && (Ln(z) ? (r.cp = Br(z), r.ty = T.ty(), r.p = T.getColumnPosition(), r.handle_touchmove(z)) : T.setSelectRowIndex(T.getRowIndexAt(z)))
			},
			handleWindowMouseUp: function() {
				this.clear()
			},
			handleWindowTouchEnd: function() {
				this.clear()
			},
			handle_mouseup: function(G) {
				this.handle_touchend(G)
			},
			handle_touchend: function(e) {
				var q = this;
				if(q.cp && !q._62O) {
					var u = q.pv,
						y = u.lp(e),
						t = y.x,
						J = y.y,
						C = u._indent,
						X = u.getRowIndexAt(e),
						N = u._9I;
					if(X >= 0) {
						var F = u._rowHeight,
							l = F * X,
							P = u._rows.get(X),
							$ = P.property;
						if(Ol(P)) Ui(u.isExpanded(P) ? u._expandIcon : u._collapseIcon) && t >= 0 && C >= t && J >= l && l + F >= J ? u.toggle(P) : Jm(e) && u.toggle(P);
						else if(t > N && u.isPropertyEditable($, e)) {
							var K = {
									x: N + 1,
									y: l,
									width: u.getWidth() - N - 1,
									height: F
								},
								D = {
									x: K.x + u.tx(),
									y: K.y + u.ty(),
									width: K.width,
									height: K.height
								},
								V = 0,
								B = u._29I;
							K.y < B.y ? V = K.y - B.y : K.y + F > B.y + B.height && (V = K.y + F - B.y - B.height), V && (u.ty(u.ty() - V), D.y -= V), u.beginEditing({
								data: P.data,
								property: $,
								value: u.getValue(P.data, $),
								event: e,
								rect: K,
								editorRect: D,
								view: u
							})
						}
					}
					u.setSelectRowIndex(X)
				}
				q.clear()
			},
			handleWindowMouseMove: function(n) {
				this.handleWindowTouchMove(n)
			},
			handleWindowTouchMove: function(d) {
				var v = this,
					g = v.pv,
					E = v.ty,
					M = v.cp,
					Q = Br(d),
					i = v._62O;
				if("p" === i) g.setTranslateY(E + Q.y - M.y);
				else if("c" === i) {
					var p = g.getWidth() - g._indent;
					if(p > 16) {
						var O = v.p - (M.x - Q.x) / p,
							m = 16 / p;
						m > O && (O = m), O > 1 - m && (O = 1 - m), g.setColumnPosition(O)
					}
				} else "s" === i && g.setTranslateY(E + (M.y - Q.y) * g._59I / g._29I.height)
			},
			handle_mousemove: function(M) {
				this.handle_touchmove(M)
			},
			handle_touchmove: function(y) {
				if(!zg && Ln(y)) {
					var u = this,
						q = u.pv,
						l = d(q.lp(y).x - q._9I) <= (k ? 8 : 3);
					u.cp ? u._62O || (l ? (u._62O = "c", ti(u)) : d(Br(y).y - u.cp.y) >= 2 && (u._62O = u.isV(y) ? "s" : "p", ti(u))) : (l ? u.setCursor(Ci) : u.setCursor(Lm), u.isV(y) && q._43o())
				}
			},
			isV: function(r) {
				var A = this.pv,
					R = A._29I;
				return A._41o() && R.x + R.width - A.lp(r).x < jq
			},
			handle_mousewheel: function(Z) {
				this.handleScroll(Z, Z.wheelDelta / 40)
			},
			handle_DOMMouseScroll: function(N) {
				2 === N.axis && this.handleScroll(N, -N.detail)
			},
			handleScroll: function(P, b) {
				var p = this.pv;
				Aj(P), p.endEditing(), p.translate(0, b * p.getRowHeight())
			},
			handle_keydown: function(u) {
				var a = this.pv,
					O = a._rows.size(),
					b = a._selectRowIndex + (xm(u) ? -1 : 1);
				(xm(u) || Qh(u)) && (0 > b && (b = 0), b >= O && (b = O - 1), a.setSelectRowIndex(b))
			}
		}), dc.ListView = function(G) {
			this._5o(G), new rm(this)
		}, $k("ListView", f, {
			ms_ac: [qo, rp, ie, sd, Rh, Ir, tj, Vn, $q, oq, fb, eq, Bl, hn],
			ms_v: 1,
			ms_bnb: 1,
			ms_tip: 1,
			ms_fire: 1,
			ms_sm: 1,
			_49o: 1,
			ms_txy: 1,
			ms_lp: 1,
			ms_vs: 1,
			ms_hs: 1,
			_15Q: 1,
			_14Q: 1,
			ms_dm: 1,
			_45o: 1,
			_checkMode: !1,
			_indent: ab,
			_rowHeight: Hr,
			_rowLineVisible: h.listViewRowLineVisible,
			_rowLineColor: h.listViewRowLineColor,
			_scrollBarColor: Bq,
			_scrollBarSize: sr,
			_autoMakeVisible: zs,
			_autoHideScrollBar: Vp,
			_selectBackground: h.listViewSelectBackground,
			_labelColor: h.listViewLabelColor,
			_labelSelectColor: h.listViewLabelSelectColor,
			_labelFont: h.listViewLabelFont,
			isCheckMode: function() {
				return this._checkMode
			},
			setCheckMode: function(g) {
				var p = this,
					F = p._checkMode;
				p._checkMode = g, p.fp(Ym, F, g)
			},
			drawRow: function(H, L, d, r, Y, h, V) {
				var g = this,
					x = 0,
					J = g._indent,
					A = g.getIconWidth(L);
				g.drawRowBackground(H, L, d, r, Y, h, V), g._checkMode && (Ip(H, Ui(g.getCheckIcon(L)), x + J / 2, Y + V / 2, L, g), x += J), g.drawIcon(H, L, x, Y, A, V), g.drawLabel(H, L, x + A, Y, V)
			}
		});
		var rm = function($) {
			this.list = $, this._lastSelectDataTime = Bk(), this.addListeners()
		};
		xh(rm, f, {
			ms_listener: 1,
			getView: function() {
				return this.list._view
			},
			clear: function(z) {
				var n = this,
					T = n.list;
				z && "d" === n._62O && !n.dragCancel && T.handleDragAndDrop(z, "end"), T.draggingData && (T.draggingData = null, T.redraw()), n.dragCancel = n._62O = n._isV = n._isH = n.cp = n.tx = n.ty = _
			},
			handle_mousedown: function(m) {
				this.handle_touchstart(m)
			},
			handle_touchstart: function(a) {
				var O = this,
					j = O.list;
				if(Aj(a), j.setFocus(a)) {
					var L = j.getDataAt(a);
					O.cp = Br(a), O.tx = j.tx(), O.ty = j.ty(), Ln(a) ? L && j.handleDragAndDrop && !O.isV(a) && !O.isH(a) && (j.draggingData = L, j.redraw(), j.handleDragAndDrop(a, "prepare")) : (L && O._33o(a, L), O.clear(a))
				}
			},
			handleWindowMouseUp: function(j) {
				this.clear(j)
			},
			handleWindowTouchEnd: function($) {
				this.clear($)
			},
			handle_mouseup: function(Z) {
				this.handle_touchend(Z)
			},
			handle_touchend: function(A) {
				var w = this,
					M = w.list;
				if(!w._isV && !w._isH && w.cp && !w._62O) {
					var p = M.getDataAt(A);
					p ? (M.isCheckMode() ? w._34o(A, p) : w._33o(A, p), Jm(A) ? M.onDataDoubleClicked(p, A) : M.onDataClicked(p, A)) : M.handleBackgroundClick(A)
				}
				w.clear(A)
			},
			handleWindowMouseMove: function(j) {
				this.handleWindowTouchMove(j)
			},
			handleWindowTouchMove: function(e) {
				var x = this,
					C = x.list,
					i = x._62O,
					B = x.tx,
					J = x.ty,
					r = x.cp,
					V = Br(e),
					h = C._29I;
				"p" === i ? C.setTranslate(B + V.x - r.x, J + V.y - r.y) : "v" === i ? C.ty(J + (r.y - V.y) * C._59I / h.height) : "h" === i ? C.tx(B + (r.x - V.x) * C._91I / h.width) : "d" === i && (x.dragCancel || C.handleDragAndDrop(e, "between"))
			},
			handle_mousemove: function(Z) {
				this.handle_touchmove(Z)
			},
			handle_touchmove: function(A) {
				if(!zg && Ln(A)) {
					var q = this,
						t = q.list;
					if(q._isV = q.isV(A), q._isH = q.isH(A), q.cp) {
						if(!q._62O) {
							if(uh(Br(A), q.cp) < 2) return;
							q._isV ? q._62O = "v" : q._isH ? q._62O = "h" : t.draggingData && !this.dragCancel ? (q._62O = "d", t.handleDragAndDrop(A, "begin")) : q._62O = "p", q._62O && "d" !== q._62O && t.draggingData && (t.draggingData = null, t.redraw()), ti(q)
						}
					} else q._isV && t._43o(), q._isH && t._42o()
				}
			},
			isV: function(D) {
				var C = this.list,
					G = C._29I;
				return C._41o() && G.x + G.width - C.lp(D).x < jq
			},
			isH: function(m) {
				var K = this.list,
					u = K._29I;
				return K._40o() && u.y + u.height - K.lp(m).y < jq
			},
			handle_mousewheel: function(M) {
				this.handleScroll(M, M.wheelDelta / 40, M.wheelDelta !== M.wheelDeltaX)
			},
			handle_DOMMouseScroll: function(d) {
				this.handleScroll(d, -d.detail, 1)
			},
			handleScroll: function(t, U, x) {
				var K = this.list;
				Aj(t), K.endEditing && K.endEditing(), x && K._41o() ? K.translate(0, U * K.getRowHeight()) : K._40o() && K.translate(10 * U, 0)
			},
			handle_keydown: function(J) {
				if(!h.isInput(J.target)) {
					var N, j = this.list,
						r = j.sm(),
						q = j._rows,
						v = q.size();
					if(pq(J)) j.selectAll();
					else if(Hg(J)) j.handleDelete && j.handleDelete(J);
					else if(_f(J)) "d" !== this._62O || this.dragCancel || (j.handleDragAndDrop(J, "cancel"), this.dragCancel = !0);
					else if(ec(J)) j.isCheckMode() && (N = j.getFocusData(), N && j.checkData(N));
					else if(xm(J) || Qh(J)) {
						var A = j.isCheckMode();
						if(N = A ? j.getFocusData() : r.ld()) {
							var G = j.getRowIndex(N);
							G >= 0 && (xm(J) ? 0 !== G && (N = q.get(G - 1), A ? j.setFocusData(N) : r.ss(N)) : G !== v - 1 && (N = q.get(G + 1), A ? j.setFocusData(N) : r.ss(N)))
						} else v > 0 && (N = q.get(0), A ? j.setFocusData(N) : r.ss(N))
					}
				}
			},
			_34o: function($, O) {
				var T = this.list,
					t = T.lp($).x;
				return t >= 0 && t <= T._indent ? (T.checkData(O), void 0) : (T.setFocusData(O), void 0)
			},
			_33o: function(p, S) {
				var C = this.list,
					t = C.sm(),
					M = t.ld();
				if(Sj(p)) C.isSelected(S) ? t.rs(S) : t.as(S);
				else if(Tm(p))
					if(M)
						for(var h = C.getRowIndex(M), T = C.getRowIndex(S); h !== T;) h += T > h ? 1 : -1, t.as(C._rows.get(h));
					else t.ss(S);
				else if(Ln(p)) {
					var z = Bk();
					if(t.contains(S)) {
						var w = z - this._lastSelectDataTime;
						C.handleDataDoubleSelect && w > 500 && 1500 > w && C.handleDataDoubleSelect(p, S)
					}
					t.ss(S), this._lastSelectDataTime = z
				} else t.contains(S) || t.ss(S)
			}
		}), dc.TreeView = function(d) {
			var b = this;
			b._35o(), b._5o(d), new Zj(b)
		}, $k("TreeView", f, {
			ms_ac: [qo, rp, ie, "rootVisible", Ym, "rootData", Vn, $q, oq, fb, eq, Rh, sd, Ir, tj, Rq, gn, Bl, hn, "loader", "doubleClickToToggle"],
			ms_v: 1,
			ms_bnb: 1,
			ms_tip: 1,
			ms_fire: 1,
			ms_sm: 1,
			_49o: 1,
			ms_txy: 1,
			ms_lp: 1,
			ms_vs: 1,
			ms_hs: 1,
			_15Q: 1,
			ms_dm: 1,
			_48o: 1,
			_14Q: 1,
			_45o: 1,
			_checkMode: _,
			_indent: ab,
			_rowHeight: Hr,
			_rowLineVisible: h.treeViewRowLineVisible,
			_rowLineColor: h.treeViewRowLineColor,
			_scrollBarColor: Bq,
			_scrollBarSize: sr,
			_autoHideScrollBar: Vp,
			_expandIcon: h.treeViewExpandIcon,
			_collapseIcon: h.treeViewCollapseIcon,
			_autoMakeVisible: zs,
			_selectBackground: h.treeViewSelectBackground,
			_labelColor: h.treeViewLabelColor,
			_labelSelectColor: h.treeViewLabelSelectColor,
			_labelFont: h.treeViewLabelFont,
			_doubleClickToToggle: h.treeViewDoubleClickToToggle,
			drawRow: function(s, R, L, k, Y, y, l) {
				var A = this;
				A.drawRowBackground(s, R, L, k, Y, y, l), A._97I(s, R, L, 0, Y, y, l)
			},
			isOnToggleIcon: function(x) {
				var p = this.getDataAt(x);
				if(p) {
					var k = this.getIndent(),
						I = this.lp(x).x;
					if(Ui(this.getToggleIcon(p))) {
						var a = k * this.getLevel(p);
						if(I >= a && a + k >= I) return !0
					}
				}
				return !1
			}
		});
		var Zj = function(C) {
			wp(Zj, this, [C])
		};
		xh(Zj, rm, {
			toggle: function(t, p, Z, v) {
				var C = this.list,
					E = C.lp(t).x;
				if(Ui(C.getToggleIcon(p))) {
					var V = Z * v;
					if(E >= V && V + Z >= E) return C.toggle(p), !0
				}
				return C.isDoubleClickToToggle() && Jm(t) ? (C.toggle(p), !0) : !1
			},
			_34o: function(Q, X) {
				var N = this.list,
					b = N.lp(Q).x,
					d = N._levelMap[X._id],
					m = N._indent,
					S = m * (d + 1);
				return b >= S && S + m >= b ? (N.checkData(X), void 0) : (this.toggle(Q, X, m, d) || N.setFocusData(X), void 0)
			},
			_33o: function(u, j) {
				var S = this,
					x = S.list;
				S.toggle(u, j, x._indent, x.getLevel(j)) || Zj.superClass._33o.call(S, u, j)
			},
			handle_keydown: function(C) {
				if(pi(C) || lb(C)) {
					var s = this.list,
						J = s._rows,
						p = s.isCheckMode(),
						d = s.sm(),
						w = p ? s.getFocusData() : d.ld();
					w ? w.hasChildren() && (pi(C) ? s.collapse(w) : s.expand(w)) : J.size() > 0 && (w = J.get(0), p ? s.setFocusData(w) : d.ss(w))
				} else Zj.superClass.handle_keydown.call(this, C)
			}
		});
		var Pb = dc.TableView = function(J) {
			this._98I(), this._5o(J), new Vf(this)
		};
		$k("TableView", f, {
			ms_ac: [qo, rp, ie, "sortMode", uf, hi, sd, Ir, tj, tm, Tr, "sortColumn", Vn, $q, oq, fb, eq, Bl, hn],
			ms_v: 1,
			ms_fire: 1,
			ms_sm: 1,
			_49o: 1,
			ms_txy: 1,
			ms_lp: 1,
			ms_vs: 1,
			ms_hs: 1,
			_15Q: 1,
			ms_dm: 1,
			ms_tip: 1,
			_50o: 1,
			_45o: 1,
			_47o: 1,
			_sortMode: hc,
			_editable: !0,
			_batchEditable: !1,
			_rowHeight: Hr,
			_rowLineVisible: h.tableViewRowLineVisible,
			_rowLineColor: h.tableViewRowLineColor,
			_columnLineVisible: h.tableViewColumnLineVisible,
			_columnLineColor: h.tableViewColumnLineColor,
			_scrollBarColor: Bq,
			_scrollBarSize: sr,
			_autoHideScrollBar: Vp,
			_autoMakeVisible: zs,
			_selectBackground: h.tableViewSelectBackground,
			_labelColor: h.tableViewLabelColor,
			_labelSelectColor: h.tableViewLabelSelectColor,
			_labelFont: h.tableViewLabelFont,
			getCheckColumn: function() {
				var r = this;
				if(!r._31o) {
					var z = r._31o = new hd;
					z.setEditable(!0), z.setWidth(40), z.getValue = r.getCheckColumValue, z.drawCell = r.drawCheckColumnCell
				}
				return r._31o
			},
			isCheckMode: function() {
				return this._39o.contains(this._31o)
			},
			setCheckMode: function(c) {
				var b = this,
					$ = b._39o,
					H = b.getCheckColumn();
				c !== b.isCheckMode() && (c ? $.add(H, 0) : $.remove(H), b.fp(Ym, !c, c))
			},
			getCheckColumValue: function(x, $, e) {
				return e.isSelected(x)
			},
			drawCheckColumnCell: function(I, L, D, u, $, Y, S, m, x) {
				Ip(I, x.getCheckIcon(L), $ + S / 2, Y + m / 2, L, x)
			}
		});
		var Vf = function(c) {
			wp(Vf, this, [c])
		};
		xh(Vf, rm, {
			_34o: function(k, V) {
				var j = this.list,
					W = j._31o;
				if(j.isCellEditable(V, W, k)) {
					var q = j._3Q(W),
						H = j.lp(k).x;
					if(q && H >= q.startX && H < q.startX + W.getWidth()) return j.checkData(V), void 0
				}
				j._37O(V, k), j.setFocusData(V)
			},
			_33o: function(i, d) {
				this.list._37O(d, i), Vf.superClass._33o.apply(this, arguments)
			}
		});
		var ok = dc.TreeTableView = function(f) {
				var I = this,
					z = I._4o = new hd;
				I._35o(), I._98I(), I._5o(f), z.setDisplayName("Name"), z.setEditable(!0), z.setWidth(180), z.drawCell = Er, z.getValue = Wo, I._39o.add(z), new ei(I)
			},
			Er = function(h, j, o, A, I, B, m, r, n) {
				n._97I(h, j, o, I, B, m, r)
			},
			Wo = function(o, i, p) {
				return p.getLabel(o)
			};
		$k("TreeTableView", f, {
			ms_ac: [qo, rp, ie, "sortMode", uf, hi, Rh, Ym, "rootData", "rootVisible", Vn, $q, "sortColumn", Rq, gn, oq, fb, eq, Bl, tj, sd, Ir, tm, Tr, hn, "loader"],
			ms_v: 1,
			ms_bnb: 1,
			ms_fire: 1,
			ms_sm: 1,
			_49o: 1,
			ms_txy: 1,
			ms_lp: 1,
			ms_vs: 1,
			ms_hs: 1,
			_15Q: 1,
			ms_dm: 1,
			ms_tip: 1,
			_50o: 1,
			_48o: 1,
			_14Q: 1,
			_45o: 1,
			_47o: 1,
			_sortMode: hc,
			_checkMode: _,
			_editable: !0,
			_batchEditable: !1,
			_indent: ab,
			_rowHeight: Hr,
			_rowLineVisible: h.treeTableViewRowLineVisible,
			_rowLineColor: h.treeTableViewRowLineColor,
			_columnLineVisible: h.treeTableViewColumnLineVisible,
			_columnLineColor: h.treeTableViewColumnLineColor,
			_expandIcon: h.treeTableViewExpandIcon,
			_collapseIcon: h.treeTableViewCollapseIcon,
			_scrollBarColor: Bq,
			_scrollBarSize: sr,
			_autoHideScrollBar: Vp,
			_autoMakeVisible: zs,
			_selectBackground: h.treeTableViewSelectBackground,
			_labelColor: h.treeTableViewLabelColor,
			_labelSelectColor: h.treeTableViewLabelSelectColor,
			_labelFont: h.treeTableViewLabelFont,
			getTreeColumn: function() {
				return this._4o
			}
		});
		var ei = function(C) {
			wp(ei, this, [C])
		};
		xh(ei, rm, {
			_34o: function(s, E) {
				var Z = this.list,
					G = Z._4o,
					n = Z._3Q(G),
					A = Z.lp(s).x;
				if(n) {
					var i = Z._indent,
						I = n.startX + i * Z.getLevel(E);
					if(Ui(Z.getToggleIcon(E)) && A >= I && I + i >= A) return Z.toggle(E), void 0;
					if(Z.isCellEditable(E, G) && (I += i, A >= I && I + i >= A)) return Z.checkData(E), void 0
				}
				Z._37O(E, s), Z.setFocusData(E)
			},
			_33o: function(T, E) {
				var e = this.list,
					D = e.lp(T).x;
				if(Ui(e.getToggleIcon(E))) {
					var b = e._3Q(e._4o);
					if(b) {
						var m = e._indent,
							P = b.startX + m * e.getLevel(E);
						if(D >= P && P + m >= D) return e.toggle(E), void 0
					}
				}
				e._37O(E, T), ei.superClass._33o.apply(this, arguments)
			}
		});
		var of = dc.TableHeader = function(d) {
			var L = this,
				$ = L._view = Co(1, L),
				l = L._39o = d.getColumnModel(),
				W = L.iv;
			L.tv = L._tableView = d, L._60I = new ag, L._canvas = Qc($), $.style.background = h.tableHeaderBackground || "", $.style.height = mg + hh, l.mm(W, L), l.md(W, L), l.mh(W, L), d.mp(function(K) {
				Fc[K.property] && L.iv()
			}, L), new uj(L), L.iv()
		};
		$k("TableHeader", f, {
			ms_v: 1,
			ms_lp: 1,
			ms_fire: 1,
			ms_ac: ["checkIcon", "sortDescIcon", "sortAscIcon", qo, ie, Rh, "moveBackground", "insertColor", tm, Tr, "resizable", "movable"],
			_checkIcon: $n,
			_movable: !0,
			_resizable: !0,
			_labelColor: h.tableHeaderLabelColor,
			_labelFont: h.tableHeaderLabelFont,
			_columnLineColor: h.tableHeaderColumnLineColor,
			_columnLineVisible: h.tableHeaderColumnLineVisible,
			_sortDescIcon: h.tableHeaderSortDescIcon,
			_sortAscIcon: h.tableHeaderSortAscIcon,
			_moveBackground: h.tableHeaderMoveBackground,
			_insertColor: h.tableHeaderInsertColor,
			_indent: ab,
			getCheckIcon: function() {
				return this._checkIcon
			},
			getTableView: function() {
				return this.tv
			},
			getLabel: function(i) {
				return i.toLabel()
			},
			getLabelFont: function() {
				return this._labelFont
			},
			getLabelColor: function(m) {
				return m.getColor() || this._labelColor
			},
			getLabelAlign: function(b) {
				return b._align
			},
			onPropertyChanged: function() {
				this.iv()
			},
			_5Q: function(K) {
				this._61I = K, this.iv()
			},
			getLogicalPoint: function(T) {
				return qg(T, this._canvas, this.tv.tx())
			},
			validateImpl: function() {
				var s = this,
					c = s._canvas,
					V = s.getWidth(),
					T = s.getHeight(),
					S = s.tv,
					i = s._60I,
					u = s._61I,
					U = -S.tx(),
					X = 0;
				(V !== c.clientWidth || T !== c.clientHeight) && Mj(c, V, T), i.clear(), s._39o._roots.each(function(E) {
					if(E.isVisible()) {
						var r = X + E.getWidth();
						U + V >= X && r >= U && i.add({
							column: E,
							startX: X
						}), X = r
					}
				});
				var l = wc(c);
				if(bi(l, -U, 0, 1), l.beginPath(), l.rect(U, 0, V, T), l.clip(), l.clearRect(U, 0, V, T), i.each(function(o) {
						var F = o.column,
							x = o.startX,
							z = F.getWidth();
						z > 0 && (l.save(), l.beginPath(), l.rect(x, 0, z, T), l.clip(), u && u.column === F || s.drawColumn(l, F, x, 0, z, T), s._columnLineVisible && jo(l, x + z - 1, 0, 1, T, s._columnLineColor), l.restore())
					}), u) {
					var a = u.column,
						X = u.startX,
						A = u.position,
						p = a.getWidth();
					l.save(), l.beginPath(), l.rect(X, 0, p, T), l.clip(), l.fillStyle = s._moveBackground, l.fill(), s.drawColumn(l, a, X, 0, p, T), l.restore(), Vc(l, s._insertColor, A, 0, T)
				}
				l.restore()
			},
			_6Q: function(G) {
				var T = this.tv;
				return T._31o === G && T.sm().getSelectionMode() === li
			},
			drawColumn: function(D, Q, J, K, M, e) {
				var w = this,
					r = w.tv,
					B = Ui(Q.getIcon()),
					y = w.getLabelAlign(Q);
				if(w._6Q(Q)) {
					var l = Ui(w._checkIcon);
					Ip(D, l, J + M / 2, K + e / 2, Q, w)
				} else {
					var E = w.getLabel(Q),
						t = w.getLabelFont(Q),
						h = w.getLabelColor(Q),
						x = Re(t, E).width,
						T = B ? w._indent : 0;
					y === vr ? (B && yq(D, B, kh, J, K, T, e), ul(D, E, t, h, J + T, K, M, e, vr)) : y === Td ? (B && yq(D, B, kh, J + M - x - T, K, T, e), ul(D, E, t, h, J, K, M, e, Td)) : (B && yq(D, B, kh, J + (M - x - T) / 2, K, T, e), ul(D, E, t, h, J + (M - x + T) / 2, K, 0, e, vr))
				}
				if(Q.isSortable() && r.getSortColumn() === Q && (B = Ui(Q.getSortOrder() === cd ? w._sortAscIcon : w._sortDescIcon))) {
					var L = ui(B, Q) / 2 + 2;
					Ip(D, B, y === Td ? J + L : J + M - L, K + e / 2, Q, r)
				}
			}
		});
		var uj = function(E) {
			var $ = this;
			$.th = E, $.tv = E._tableView, $.addListeners()
		};
		xh(uj, f, {
			ms_listener: 1,
			getView: function() {
				return this.th.getView()
			},
			setCursor: function(R) {
				this.getView().style.cursor = R
			},
			handle_mousemove: function(n) {
				if(!zg) {
					var j = this;
					delete j._29o, j.setCursor(Lm);
					for(var N = j.th, i = N._60I, A = N.lp(n).x, F = i.size() - 1; F >= 0; F--) {
						var T = i.get(F),
							o = T.column,
							l = T.startX + o.getWidth();
						if(N.isResizable() && d(l - A) <= (k ? 10 : 3)) return j._29o = T, j.setCursor(Ci), void 0;
						A > T.startX && l > A && (j._29o = T), (o.isClickable() || o.isSortable() || N.isMovable() || j.tv.getCheckColumn && o === j.tv.getCheckColumn()) && A > T.startX && l > A && j.setCursor(rn)
					}
				}
			},
			handle_mousedown: function(S) {
				this.handle_touchstart(S)
			},
			handle_touchstart: function(U) {
				var x = this;
				Aj(U), x.tv.endEditing(), x.handle_mousemove(U), x._29o && (x.x = Br(U).x, x.lx = x.th.lp(U).x, x.w = x._29o.column.getWidth(), ti(x, U))
			},
			handleWindowMouseMove: function(W) {
				this.handleWindowTouchMove(W)
			},
			handleWindowTouchMove: function(k) {
				var r = this,
					I = r.th,
					A = r.getView().style.cursor,
					L = r._29o,
					B = Br(k).x - r.x;
				if(r.resizing || r.moving || (A === Ci ? r.resizing = 1 : I.isMovable() && A === rn && d(B) > 2 && (r.moving = 1)), r.resizing) L.column.setWidth(r.w + B);
				else if(r.moving) {
					var U = r.lx + B;
					I._60I.each(function(u) {
						var w = u.startX,
							c = w + u.column.getWidth();
						if(U >= w && c >= U) {
							var b = {
								column: L.column,
								startX: L.startX + B,
								front: c - U > U - w,
								insertColumn: u.column
							};
							b.position = b.front ? w : c, I._5Q(b)
						}
					})
				}
			},
			_16Q: function(K, r) {
				var V = this,
					j = V.tv,
					b = V.th,
					P = b._checkIcon;
				if(b._6Q(K)) {
					var R = Ui(P),
						n = V.lx,
						E = K.getWidth(),
						Y = ui(R, K);
					if(n >= r + E / 2 - Y && r + E / 2 + Y >= n) {
						b.setCheckIcon(P === Ek ? $n : Ek);
						var o = j.sm(),
							F = j._rows;
						return P === Ek ? o.rs(F) : o.ss(F), j.onCheckColumnClicked(K), !0
					}
				}
				return !1
			},
			handleWindowMouseUp: function(L) {
				this.handleWindowTouchEnd(L)
			},
			handleWindowTouchEnd: function(m) {
				var a = this,
					U = a.tv,
					B = a.th,
					e = a._29o;
				if(a.moving) {
					var n = B._61I;
					if(n && n.insertColumn !== n.column) {
						var C = n.column,
							L = U.getColumnModel()._roots,
							K = L.remove(C),
							O = L.indexOf(n.insertColumn);
						O >= 0 && (n.front || O++, O <= L.size() && (L.add(C, O), U.getColumnModel()._38I(C, K, O)))
					}
					B._5Q(_), delete a.moving
				} else if(!a.resizing && e) {
					C = e.column;
					var M = B.lp(m).x,
						q = e.startX,
						N = !0;
					if(B.onColumnClicked) {
						var W = B.onColumnClicked(C, m, q);
						W === !1 && (N = !1)
					}
					if(N && M >= q && M <= q + C.getWidth() && !a._16Q(C, q)) {
						if(C.isSortable()) {
							var i = U.getSortMode(),
								I = C.getSortOrder();
							i === hc ? U.getSortColumn() === C ? (I === zo && U.setSortColumn(_), C.setSortOrder(I === cd ? zo : cd)) : U.setSortColumn(C) : "bistate" === i && (U.getSortColumn() === C ? C.setSortOrder(I === cd ? zo : cd) : U.setSortColumn(C))
						}
						U.onColumnClicked(C, m, q)
					}
				}
				a._29o = a.resizing = a.x = a.lx = a.w = _
			}
		}), dc.TablePane = function(R) {
			this.init(new Pb(R))
		}, $k("TablePane", f, {
			ms_v: 1,
			_44o: 1
		}), dc.TreeTablePane = function(e) {
			this.init(new ok(e))
		}, $k("TreeTablePane", f, {
			ms_v: 1,
			_44o: 1
		}), dc.Toolbar = function(A) {
			var W = this,
				F = W._view = Co(1, W),
				o = F.style;
			o.background = h.toolbarBackground || "", o.height = vf + hh, W._canvas = Qc(F), W._30o = new ag, W._90I = new ag, W.setItems(A || []), F.handleGroupSelectedChanged = function(Z) {
				if(Z.isSelected()) {
					var b = Z.getGroupId();
					null != b && W._items.forEach(function(Q) {
						var N = Q.element;
						N && N !== Z && N.setSelected && N.getGroupId && N.getGroupId() === b && N.setSelected(!1)
					})
				}
			}, new ye(W)
		}, $k("Toolbar", f, {
			ms_v: 1,
			ms_fire: 1,
			ms_tx: 1,
			ms_lp: 1,
			ms_tip: 1,
			ms_value: 1,
			ms_ac: [_p, qo, ie, rp, hn, "itemGap", "separatorColor", "currentItem", "stickToRight"],
			_labelColor: h.toolbarLabelColor,
			_labelSelectColor: h.toolbarLabelSelectColor,
			_labelFont: h.toolbarLabelFont,
			_selectBackground: h.toolbarSelectBackground,
			_itemGap: h.toolbarItemGap,
			_separatorColor: h.toolbarSeparatorColor,
			_stickToRight: !1,
			getSumWidth: function() {
				return this._64I
			},
			getToolTip: function(g) {
				var $ = this.getItemInfoAt(g);
				return $ ? $.item.toolTip : _
			},
			getLabelColor: function(k) {
				return k && k.selected && k.type !== Ek && k.type !== Pl ? this._labelSelectColor : this._labelColor
			},
			onPropertyChanged: function(T) {
				this.iv(), T.property === _p && this._items.forEach(function(e) {
					Tb(e)
				})
			},
			redraw: function() {
				this.iv()
			},
			addItem: function(g, P) {
				var m = this._items;
				P == _ ? m.push(g) : m.splice(P, 0, g), this.fp(_p, _, m)
			},
			removeItem: function(p) {
				if(p)
					for(var Z = this._items, T = 0; T < Z.length; T++) p === Z[T] && (Z.splice(T, 1), this.fp(_p, _, Z))
			},
			removeItemById: function(G) {
				if(G != _)
					for(var r = this._items, K = 0; K < r.length; K++)
						if(G === r[K].id) {
							var e = r.splice(K, 1)[0];
							return this.fp(_p, _, r), e
						}
			},
			getItemById: function(G) {
				if(G != _)
					for(var y = this._items, X = 0; X < y.length; X++) {
						var l = y[X];
						if(G === l.id) return l
					}
			},
			setItemVisible: function(o, q) {
				var H = this.getItemById(o);
				H && (H.visible = q)
			},
			getItemInfos: function() {
				return this._30o
			},
			getItemInfoAt: function(r) {
				var U = this,
					M = 0,
					C = U._30o,
					l = U.lp(r),
					W = l.x,
					t = l.y;
				if(t >= 0 && t <= U.getHeight())
					for(; M < C.size(); M++) {
						var S = C.get(M);
						if(S.startX <= W && W <= S.endX) return S
					}
				return _
			},
			drawItem: function(A, h, t, p, l) {
				if(h.visible === !1) return 0;
				if(jc(h.visible) && !h.visible()) return 0;
				var W = this,
					R = h.disabled;
				R && (A.globalAlpha = ck);
				var i = W.drawItemImpl(A, h, t, p, l),
					O = W._itemGap;
				return R && (A.globalAlpha = 1), this._currentItem !== h || "separator" === h || h.separator === !0 || h.unfocusable || so(A, W._separatorColor, t - O / 2, 0, i + O, p), i
			},
			drawItemImpl: function(b, N, W, r, V) {
				var m = this,
					$ = m._view,
					n = m._itemGap,
					i = r / 2,
					v = N.type,
					s = N.element,
					c = N.label;
				Ol(s) && (c = s, s = _);
				var A, U = m.getLabelFont(N),
					f = m.getLabelColor(N),
					p = N.selected,
					d = Ui(N.icon),
					Z = ui(d, N),
					h = 0,
					K = Z + (c ? Re(U, c).width : 0);
				if("separator" === N || N.separator === !0) return Vc(b, m._separatorColor, W, r / 4, i), 1;
				if(s) {
					d && Ip(b, d, W + Z / 2, i, N, m), ul(b, c, U, f, W + Z, 0, 0, r);
					var S = Pp(s);
					V || m._90I.add(S), S.parentNode !== $ && Yb($, S), s.iv && s.iv(), s.validate && s.validate();
					var j = S.getBoundingClientRect(),
						P = j.width,
						q = S.style;
					return uc(S), q.left = m.tx() + W + K + hh, q.top = (r - j.height) / 2 + hh, K + P
				}
				return v === Pl ? A = Ui(p ? Nc : rj) : v === Ek && (A = Ui(p ? Ek : $n)), A ? (h = ui(A, N), Ip(b, A, W + h / 2, i, N, m), W += h, K += h) : p && jo(b, W - n / 2, 0, K + n, r, m.getSelectBackground(N)), d && Ip(b, d, W + Z / 2, i, N, m), ul(b, c, U, f, W + Z, 0, 0, r), K
			},
			validateImpl: function() {
				var a = this,
					l = a._canvas,
					z = a.getWidth(),
					y = a.getHeight(),
					m = a._30o,
					k = a._items;
				Mj(l, z, y);
				var V = wc(l),
					n = a._itemGap,
					Q = n / 2;
				bi(V, a.tx(), 0, 1), V.clearRect(0, 0, z, y);
				var W = a._90I;
				a._90I = new ag, m.clear(), k.forEach(function(h) {
					var t = a.drawItem(V, h, Q, y);
					m.add({
						item: h,
						startX: Q,
						endX: Q + t,
						width: t
					}), t && (Q += t + n)
				}), W.each(function(T) {
					a._90I.contains(T) || Cj(T)
				});
				var C = a._64I;
				a._64I = N(0, Q), V.restore(), a._stickToRight ? (a._65O = 0, V = wc(l), Q = z - a._64I + n, bi(V, 0, 0, 1), V.clearRect(0, 0, z, y), m.clear(), k.forEach(function(B) {
					var I = a.drawItem(V, B, Q, y, !0);
					m.add({
						item: B,
						startX: Q,
						endX: Q + I,
						width: I
					}), I && (Q += I + n)
				}), V.restore()) : a.tx(a.tx()), C !== a._64I && a.onSumWidthChanged(C, a._64I)
			},
			onSumWidthChanged: function() {},
			handleClick: function(h, v) {
				var a = this,
					R = h.type,
					w = h.action,
					I = h.groupId,
					L = h.selected;
				h.disabled || (I != _ ? L || (h.selected = !0, this._items.forEach(function(l) {
					l.groupId === I && h !== l && (l.selected = !1)
				}), w && h.action(h, a, v)) : R === Ek || "toggle" === R ? (h.selected = !L, w && h.action(h, a, v)) : w && h.action(h, a, v)), Jh(), a.iv()
			}
		});
		var ye = function(L) {
			this.tb = L, this.addListeners()
		};
		xh(ye, f, {
			ms_listener: 1,
			getView: function() {
				return this.tb._view
			},
			handle_mousewheel: function(x) {
				this.handleScroll(x, 10 * (x.wheelDelta / 40))
			},
			handle_DOMMouseScroll: function(M) {
				this.handleScroll(M, 10 * -M.detail)
			},
			handleScroll: function(Q, m) {
				Aj(Q);
				var H = this.tb;
				H.isScrollable() && !H._stickToRight && (H.tx(H.tx() + m), hk())
			},
			handle_mousemove: function(D) {
				var W = this;
				zg || W.setItem(D)
			},
			handle_mouseout: function(u) {
				var k = this;
				u.target === k.getView() ? k.tb.setCurrentItem(_) : k.handle_mousemove(u)
			},
			handle_mousedown: function(s) {
				this.handle_mousemove(s), this.handle_touchstart(s)
			},
			handle_touchstart: function(q) {
				var J = this,
					E = J.tb,
					w = q.target;
				Ln(q) && (w === J.getView() || w === E._canvas) && (Aj(q), E.setFocus(q) && (this.setItem(q, !0), (E.isScrollable() || J.info && !J.info.item.disabled) && (J.x = Br(q).x, J.tx = E.tx(), ti(J, q))))
			},
			handleWindowMouseMove: function(N) {
				this.handleWindowTouchMove(N)
			},
			handleWindowTouchMove: function(v) {
				var u = this,
					c = u.tb;
				if(!c._stickToRight) {
					var i = Br(v).x - u.x;
					!u._25o && d(i) > 2 && c.isScrollable() && (u._25o = 1), u._25o && c.tx(u.tx + i)
				}
			},
			handleWindowMouseUp: function(_) {
				this.handleWindowTouchEnd(_)
			},
			handleWindowTouchEnd: function(D) {
				var G = this,
					j = G.tb,
					u = G.info,
					S = G.tb.getItemInfoAt(D);
				if(!G._25o && u) {
					var r = u.item;
					S && S.item === r && j.handleClick(r, D)
				}
				G._25o = G.x = G.tx = _, G.setItem()
			},
			setItem: function(o, g) {
				var A = this,
					r = A.tb,
					s = A.info = o ? r.getItemInfoAt(o) : _,
					V = s ? s.item : _;
				r.setCurrentItem(V), g && V && jc(V.onDown) && V.onDown(o)
			}
		}), dc.BorderPane = function() {
			this._view = Co(1, this), this.iv()
		}, $k("BorderPane", f, {
			ms_v: 1,
			ms_ac: ["topHeight", "bottomHeight", "leftWidth", "rightWidth"],
			ms_fire: 1,
			getLeftView: function() {
				return this._leftView
			},
			setLeftView: function(H, h) {
				this._12o("leftView", H), h != _ && this.setLeftWidth(h)
			},
			getRightView: function() {
				return this._rightView
			},
			setRightView: function(D, R) {
				this._12o("rightView", D), R != _ && this.setRightWidth(R)
			},
			getTopView: function() {
				return this._topView
			},
			setTopView: function(y, F) {
				this._12o("topView", y), F != _ && this.setTopHeight(F)
			},
			getBottomView: function() {
				return this._bottomView
			},
			setBottomView: function(p, v) {
				this._12o("bottomView", p), v != _ && this.setBottomHeight(v)
			},
			getCenterView: function() {
				return this._centerView
			},
			setCenterView: function(j) {
				this._12o("centerView", j)
			},
			_12o: function(M, y) {
				var $ = this,
					W = "_" + M,
					t = $._view,
					n = $[W];
				n !== y && (n && (n.getView ? Cj(n.getView()) : Cj(n)), $[W] = y, y && (y.getView ? Yb(t, y.getView(), 1) : Yb(t, y, 1)), $.fp(M, n, y))
			},
			onPropertyChanged: function() {
				this.iv()
			},
			validateImpl: function() {
				var v = this,
					s = v._topView,
					H = v._bottomView,
					B = v._leftView,
					g = v._rightView,
					V = v._centerView,
					R = v.getWidth(),
					u = v.getHeight(),
					m = 0,
					a = 0,
					r = R,
					W = u,
					F = 0,
					y = 0,
					j = 0,
					l = 0;
				s && (F = v._topHeight == _ ? vl(s) : v._topHeight, a = F), H && (y = v._bottomHeight == _ ? vl(H) : v._bottomHeight, W = u - y), B && (j = v._leftWidth == _ ? nq(B) : v._leftWidth, m = j), g && (l = v._rightWidth == _ ? nq(g) : v._rightWidth, r = R - l);
				var Y = N(0, r - m),
					c = N(0, W - a);
				s && Pm(s, 0, 0, R, F), H && Pm(H, 0, W, R, y), B && Pm(B, 0, a, j, c), g && Pm(g, r, a, l, c), V && Pm(V, m, a, Y, c)
			}
		})
	}
}("undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : (0, eval)("this"), Object);